我有一个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)
感谢您的帮助!
答案 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