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

时间:2018-01-20 09:50:43

标签: ruby-on-rails date search filter ruby-on-rails-5

我正在为我的费用做一个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

然后我按日期得到了一些结果,但当然没有用户“过滤” 任何人都可以帮我解决这个问题吗?

非常感谢

1 个答案:

答案 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