所以我试图通过使用范围来过滤我的索引操作中显示的数据。
我已在DialogResult
profile.rb
它在rails控制台中工作得很好,我可以做scope :fees_to, -> (fees_to) { where("fees_to <= ?", "#{fees_to}") }
例如,它会返回所有费用小于50的配置文件。
我想知道的是如何在索引视图中创建此输入过滤器方法?
在Profile.fees_to(50)
索引操作中,代码如下:
profiles_controller.rb
我尝试以各种方式收集索引视图中的信息,但都知道可用。
非常感谢任何帮助或建议。谢谢!
答案 0 :(得分:0)
通常在rails中创建表单时,使用form_for创建表单绑定到单个模型实例,例如:form_for(@thing)
。
然而,在构建类似搜索查询或过滤器的内容时,您只需要一个没有任何数据绑定的普通旧表单,因为目标不是创建或修改资源。
<%= form_tag(profiles_path, method: :get) do %>
<% label_tag 'fees_to', 'Maximum fee' %>
<% number_field_tag 'fees_to' %>
<% submit_tag 'Search' %>
<% end %>
def index
@profiles = Profile.all
@profiles = @profiles.fees_to(params[:fees_to]) if params[:fees_to].present?
end
解释使用Profile之间的区别。而不是@profile?
Profile
是一个常量 - 在本例中包含类Profile
。
@profile
是一个实例变量 - 在此上下文中它属于控制器,很可能是nil
,因为它是索引操作。
Profile.fees_to(50) # calls the class method `fees_to` on `Profile`.
@profile.fees_to(50) # will most likely give a `NoMethodError`.
但是当你这样做时:
@profiles = Profile.all
@profiles = @profiles.fees_to(params[:fees_to]) if params[:fees_to].present?
正在发生的事情是你只是链接范围调用,如下例所示:
@users = User.where(city: 'London')
.where(forename: 'John')
除了改变变量@profiles
而不是链接。