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

Vic*_*uno 6 ruby-on-rails ruby-on-rails-3

我不确定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
Run Code Online (Sandbox Code Playgroud)

结束

视图:

<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 %>

...
Run Code Online (Sandbox Code Playgroud)

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

解!

控制器:

def index

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

....
Run Code Online (Sandbox Code Playgroud)

视图:

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

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

Jul*_*lik 2

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

@filter = Animal.new(params[:filter])
@animals = @filter.get_scope.paginate(:page => params[:page])
Run Code Online (Sandbox Code Playgroud)

在控制器中,您可以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
Run Code Online (Sandbox Code Playgroud)