具有两个参数轨的示波器

问题描述 投票:0回答:1

我正在关注this tutorial以在我的Rails应用中实现过滤功能。我希望管理员能够按年龄,标识符和创建用户的日期间隔进行过滤。这是让我有些头疼的最后一刻。

在我的模型user.rb中,我定义了以下范围:

scope :created_between, -> (startdate, enddate) {where(created_at: startdate..enddate)}
scope :identified, -> { where.not(identifier: [nil, '']) }
scope :age, -> (age) { where("age > ?", age)}

在我的控制器users_controller.rb中,我使用了一个函数来过滤参数:

def search 
 filter = params.slice(:age, :created_between, :identified)

 filter.each do |key, value|
   if value.present?
        @users = @users.public_send(key,value)
   else
        @users = @users.public_send(key)
   end
 end
end

我区分是否存在值,因为:identified范围被实现为复选框,因此不传递任何值,如

最后,我在view.html.erb文件中为所有可能的过滤器创建了一个表单:

<%= form_tag users_search_path, :method => :get, :enforce_utf8 => false do %>
  <%= date_field :created_between, "from" %>
  <%= date_field :created_between, "to" %>
  <%= check_box_tag :identified, '', false %>
  <%= text_field_tag :age, "age" %>
<% end %>

年龄和已确定作品的筛选器。当我提交表单时,仅选中已标识的复选框时查询将变为/users/search?identified=&created_between[from]=&created_between[to]=(尽管我未提交任何日期,但date_field也已传递)。还有/users/search?age=21&created_between[from]=&created_between[to]=当我仅提交年龄时。

我的问题是每当我尝试为created_between范围提交两个日期时,都会出现wrong number of arguments (1 given, expected 2)错误。我不确定我是否正确提交了日期字段。

如何将两个所需的参数传递给示波器?还是应该改用其他方式?

ruby-on-rails search filter scoping
1个回答
0
投票

啊,该死。有时仅仅写出问题似乎可以使事情变得更清楚。但是,解决方案是将:created_between的作用域函数更改为:

scope :created_between, -> (date) {where(created_at: date[:from]..date[:to])}

...对于在stackoverflow上徘徊的其他人,就像我一样,试图获得答案。

© www.soinside.com 2019 - 2024. All rights reserved.