Rails 5.1 按日期和字符串过滤器搜索



我正在为我的开支做一个 rails 应用程序基本上我有一个用户表
和一个支出表,它们之间都有关系(用户has_many支出,支出belongs_to用户)
我循环了所有用户的所有支出在一个带有标题、日期和user_id的索引中。我在此索引上添加了一个搜索按钮,以根据特定范围日期查找支出,我希望能够根据user_id进行排序.html。

<p>
<%= form_tag spendings_path, method: :get do %>
<%= date_field_tag "search[date_from]", @search.date_from, class: 'form-control col-2 d-inline-block' %>
<%= date_field_tag "search[date_to]", @search.date_to, class: 'form-control col-2 d-inline-block' %>
<%= select_tag :user_id, options_from_collection_for_select(User.all, :id, :firstname, params[:user_id]), include_blank: true, class: 'form-control col-2 d-inline-block' %>
<%= submit_tag "Search", class: "btn btn-secondary col-1 d-inline-block'" %>
<% end %>

这正确地向我显示了我想要的内容,当我使用选定的用户进行搜索时,URL 会变成这样:
http://localhost:3000/spendings?utf8=%E2%9C%93&search%5Bdate_from%5D=2017-12-20&search%5Bdate_to%5D=2018-01-20&user_id=&commit=Search

我创建了一个名为spending_search的模型,我在其中放置了这个:

class SpendingSearch
attr_reader :date_from, :date_to, :user_id

def initialize(params)
params ||= {}
@date_from = parsed_date(params[:date_from], 1.month.ago.to_date.to_s)
@date_to = parsed_date(params[:date_to], Date.today.to_s)
@user_id = params[:user_id]
end
def scope
Spending.where("date BETWEEN ? AND ? AND user_id = ?", @date_from, @date_to, user_id)
end

private
def parsed_date(date_string, default)
Date.parse(date_string)
rescue ArgumentError, TypeError
default
end
end

这是我的spendings_controller:

def index
@search = SpendingSearch.new(params[:search])
@spendings = @search.scope
end

这是我在索引中的循环:

<% @spendings.reverse_each do |spending| %>

用不同的数据显示遗忘。

问题是我无法得到任何结果。出于某种原因,我不知道它不会向我显示user_id的结果。我在这里错过了一些东西,但是什么?
如果我尝试在spending_search模型中修改范围:

def scope
Spending.where("date BETWEEN ? AND ?", @date_from, @date_to)
end

然后我按日期得到了一些结果,但当然没有用户"过滤器"。
谁能帮我解决这个问题?

多谢

提交表单后能否显示日志?您将看到传递给控制器的参数。我认为user_id不在参数[:搜索]中,而是在参数[:user_id]中。也许如果您以这种方式更改视图:

<%= select_tag "search[user_id]", options_from_collection_for_select(User.all, :id, :firstname, params[:user_id]), include_blank: true, class: 'form-control col-2 d-inline-block' %>

在作用域函数的"user_id"中,您还缺少@:

def scope
Spending.where("date BETWEEN ? AND ? AND user_id = ?", @date_from, @date_to, @user_id)
end

最新更新