我不确定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 %>
...
我在我的模型中使用范围方法,它非常灵活。我只是模糊了Controller如何“params”方法和View方法“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。
答案 0 :(得分:2)
你想要的是“按示例查询”,它在控制器中的工作方式大致相同:
@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
答案 1 :(得分:-1)
控制器
@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 %>