Rails:过滤索引页面和重新显示filter输入

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

我下面的内容用于过滤我的列表,但我也希望过滤字段重新填充当前filter的内容,我无法弄清楚如何做到这一点。 我在下面工作的方法也不像是“正确”的方法来实现这一点,因为它依赖于将空字符串传递给视图中的字段辅助方法之类的东西。

控制器:

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 

结束

视图:

 

Listing Animals

Filter By: { :action => "index" }, :html => {:method => :get} ) do |f| %>
Color: 10 ) %> Age:
...

我正在使用我的模型中的范围方法,它非常灵活。 我只是模糊了Controller如何“params”方法和View方法“form_for”,“text_field”相互映射。 有关如何重构此内容以及在列表当前已过滤时填充filter字段的任何想法?

解!

控制器:

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

视图:

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

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

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

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

并且在控制器中你可以在该示例记录上执行form_for ,但我不知道任何现代的Rails插件就是这样做的。 当然应该有这样的东西,看起来彻底。 我打赌你可以在几个小时内编写类似的东西(只需将你的filter记录的属性哈希抓到:conditions范围的: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 

调节器

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

意见

 

Listing Animals

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