轨道范围多个参数

时间:2014-08-25 18:10:17

标签: ruby-on-rails search scope

我有一个User模型。我的目标是让一个范围返回选定字段找到的users

scope :starts_with, ->(filter, starts_with) { where("? like ?", "#{filter}", "#{starts_with}%")}

这在我看来:

<%= select_tag(:filter, options_for_select([["Name", "name"],
                                                  ["E-mail", "email"]],
                                                  "name"), {:multiple => true}) %>
<%= text_field_tag :starts_with, params[:starts_with] %>

UPD 我正在调用范围:

def index
  @users = User.starts_with(params[:filter, :starts_with]).paginate(page: params[:page], per_page: 40)
end

目前它显示错误ArgumentError: wrong number of arguments(1 for 0)

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

将您的操作中的代码替换为:

def index
  @users = User.starts_with(params[:filter], params[:starts_with]).paginate(page: params[:page], per_page: 40)
end

正在进行什么

在原始通话中,您执行User.starts_with(params[:filter, :starts_with])。请注意params[:filter, :starts_with]。您正在将两个参数传递给参数[]的{​​{1}}方法。此方法只接受一个参数。查看ruby doc以获取更多信息:

http://www.ruby-doc.org/core-2.1.2/Hash.html#method-i-5B-5D

params与您在应用或任何ruby代码中可能要使用的任何其他hash一样hash。因此,您需要分别询问hash密钥和params[:filter, :starts_with]密钥的值,而不是执行未授权的:filter,并将它们作为参数传递给您的范围,如下所示:< / p>

:starts_with