我正在为我的费用做一个rails应用程序
基本上我有一个User表和一个Spending表,每个表都有一个关系(用户has_many花费,花费belongs_to用户)
我通过标题,日期和user_id索引来自索引中所有用户的所有支出。我在此索引上添加了一个搜索按钮,根据特定的范围日期查找支出,我希望能够根据user_id进行排序。
我在index.html.erb中有这个:
<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
我创建了一个名为spend_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的结果。我在这里错过了什么,但是什么? 如果我尝试在spend_search模型中修改范围:
def scope
Spending.where("date BETWEEN ? AND ?", @date_from, @date_to)
end
然后我按日期得到了一些结果,但当然没有用户“过滤” 任何人都可以帮我解决这个问题吗?
非常感谢
答案 0 :(得分:0)
提交表单后可以显示日志吗?您将看到传递给控制器的参数。我认为user_id不在params [:search]中,而是params [: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' %>
你也错过了@ in&#34; user_id&#34;在范围函数中:
def scope
Spending.where("date BETWEEN ? AND ? AND user_id = ?", @date_from, @date_to, @user_id)
end