【问题标题】:Rails: Filter index page and Re-display filter inputsRails:过滤索引页面和重新显示过滤器输入
【发布时间】:2011-08-01 19:27:14
【问题描述】:

我不确定正确的 Rails 3 方法是什么。我想在我的索引视图的顶部有过滤条件字段来过滤数据。

下面的内容可用于过滤我的列表,但我也希望使用当前过滤器重新填充过滤器字段,但我不知道该怎么做。我在下面使用的方法也感觉不是完成此操作的“正确”方法,因为它依赖于诸如将空字符串传递给我认为的字段辅助方法之类的东西。

控制器:

 def index

@animals = Animal.by_color(params[':color']).by_age(params[':age']).paginate(:page => params[:page])

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @animals }
end

结束

查看:

<h1>Listing Animals</h1>

Filter By:
<%= form_for(:animal, :url => { :action => "index" }, :html => {:method => :get} ) do |f| %>
<div>
  Color: <%= text_field'', ':color', :size => 10 ) %>
  Age: <%= text_field('', ':age') %>
  <%= f.submit "Filter List" %>
</div>
<% end %>

<%= will_paginate %>

...

我在我的模型中使用作用域方法,它工作得非常巧妙。我只是模糊控制器“params”方法和视图方法“form_for”、“text_field”如何相互映射。关于如何重构它并在当前过滤列表时填充我的过滤器字段的任何想法?

解决方案!

控制器:

def index

@search = Animal.new(params[:animal])
@animals = Animal.by_color(@search.color)...

....

查看:

<%= form_for(@search, :url => { :action => "index" }, :html => {:method => :get} ) do |f| %>
<%= f.text_field(:color)

表单填充通过在我的控制器中创建 @search 对象(除了我的主要动物对象)来工作。然后使用 form_for 围绕它创建一个 for。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    你想要的是一个“示例查询”,它在控制器中的工作方式大致如下:

    @filter = Animal.new(params[:filter])
    @animals = @filter.get_scope.paginate(:page => params[:page])
    

    在控制器中,您可以在该示例记录上执行 form_for,但我不知道有任何 现代 Rails 插件正是这样做的。当然应该有这样的东西,仔细看看。我敢打赌你可以在几个小时内写出类似的东西(只需将过滤器记录的属性哈希抓取到范围的:conditions 中,就像这样 - 未经测试):

     def get_scope
       # remove all nill attrs
       non_default_attrs = self.attributes
       self.columns.each do | col |
         # Ignore columns that have default values
         non_default_attrs.delete(col.name) if non_default_attrs[col.name] == column.default
         # Ignore columns whose values are nils
         non_default_attrs.delete(col.name) if non_default_attrs[col.name].nil?
       end
    
       where(non_default_attrs.symbolize_keys)
     end
    

    【讨论】:

    • 范围界定已经开始工作。我在我的模型中使用 Rails 3 范围方法,如下所示:scope :by_co_color, lambda { |*args| unless args.first.blank? where("color like ?", args.first.concat('%')) end }
    • 我正在尝试找出控制器视图交互,当它们被用于过滤我的索引页面时,它将保留过滤文本字段的内容。
    • 嗯,就是这样 - 您的记录将通过请求-响应循环保留过滤器表单中的参数,因为表单将使用它的数据呈现
    • 我明白了!我被你关于不同范围实施的建议分散了注意力,但你让我接近了解决方案。关键是创建一个新的 Animal 活动记录对象并围绕它创建我的表单。这是我最终得到的结果:控制器:@search = Animal.new(params[:animal]) @animals = Animal.by_color(@search.color)... 视图:&lt;%= form_for(@search, :url =&gt; { :action =&gt; "index" }, :html =&gt; {:method =&gt; :get} ) do |f| %&gt; &lt;%= f.text_field(:color) %&gt;
    【解决方案2】:

    控制器

    @search = params[:animal]
    @animals = Animal.by_color(params[:color]).by_age(params[:age]).paginate(:page => params[:page])
    

    观看次数

    <h1>Listing Animals</h1>
    
    Filter By:
    <%= form_tag animals_path do %>
    <div>
      Color: <%= text_field_tag 'color', :size => 10 %>
      Age: <%= text_field_tag 'age' %>
      <%= submit_tag "Filter List" %>
    </div>
    <% end %>
    
    <%= will_paginate %>
    

    【讨论】:

    • 这不符合我的要求。过滤列表后,它不会填充搜索字段。甚至不过滤列表 - 我已经在工作了。
    • 所以你做错了,伙计。它应该可以按您的意愿工作
    • 您建议的代码中的 form_tag 路由到编辑页面,这是 POST 的默认设置,我通过添加 :method =&gt; 'get' 进行了修复。您提供的 text_field_tag 示例缺少该值的参数,并且如所写的那样使用“size10”填充文本框。最后, params[:color] 不包含来自文本字段的值,因此过滤不起作用。因此,即使我修复了所有这些问题,在单击“过滤器列表”按钮后,过滤后的值也不会回到文本字段中。对不起,我不是想听起来很激进。我想我仍然缺少一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多