在视图中创建过滤器表单

时间:2016-10-04 09:41:25

标签: ruby-on-rails

所以我试图通过使用范围来过滤我的索引操作中显示的数据。

我已在DialogResult

中将其定义为如此
profile.rb

它在rails控制台中工作得很好,我可以做scope :fees_to, -> (fees_to) { where("fees_to <= ?", "#{fees_to}") } 例如,它会返回所有费用小于50的配置文件。

我想知道的是如何在索引视图中创建此输入过滤器方法?

Profile.fees_to(50)索引操作中,代码如下:

profiles_controller.rb

我尝试以各种方式收集索引视图中的信息,但都知道可用。

非常感谢任何帮助或建议。谢谢!

1 个答案:

答案 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而不是链接。