【问题标题】:Rails 5.1 search by date and string filterRails 5.1 按日期和字符串过滤器搜索
【发布时间】:2018-06-29 11:55:22
【问题描述】:

我正在为我的开支做一个 Rails 应用程序
基本上我有一个 User 表和一个 Spending 表,它们之间都有关系(用户 has_many 支出,支出属于_to users)
我在一个带有标题、日期和 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

我在其中创建了一个名为 consumption_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

这是我的支出控制器:

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

这是我在索引中的循环:

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

明显不同的数据。

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

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

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

非常感谢

【问题讨论】:

  • 我尝试更改支出搜索模型。如果我输入@user_id = 1,则初始化(参数)。我根据日期获得第一个用户的所有结果。看起来我无法通过表单让 user_id 通过参数。我在 URL 中有它,但在搜索中没有。那么它来自我的索引吗?也许我没有正确调用 user_id。在我搜索时的控制台中,它写着 user_id = NULL

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


【解决方案1】:

您可以在提交表单后显示日志吗?您将看到传递给控制器​​的参数。我认为 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' %>

作用域函数的“user_id”中也缺少@:

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

【讨论】:

  • 天哪,就是这样!毕竟我不是很远^^非常感谢!在我实际上有@的范围内,也许我发现它只是“搜索[user_id]”......再次感谢!
猜你喜欢
  • 2018-07-06
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多