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 %>
- 当我运行`bundle exec rake test:prepare`它出错了,但是`bundle exec rake db:test:prepare`会很好地发出警告。 这是怎么回事?
- 如何在active_model_serializers中执行预先加载
- 为什么“范围”导向的行为(特别是“索引”行动)在Pundit中有不同的处理方式?
- 使用Rails自动加载时,名称与顶级常量冲突
- “gem install rails”因DNS错误而失败
- 连接被拒绝(PGError)(postgresql和rails)
- 在我的rails答案中删除不必要的HTTP标头
- HTTP瘦服务器的HTTP查询字符串长度
- 使用Ruby on Rails进行时间可用性比较