【问题标题】:Building a rails form to filter an index page?构建一个rails表单来过滤索引页面?
【发布时间】:2010-04-24 04:30:01
【问题描述】:

G'day 伙计们,我在过滤系统中数千个贸易项目的显示时遇到了问题。根据我们正在构建的系统的规格,我们必须有一个表格,允许人们输入开始日期,然后输入以分钟为单位的间隔,以过滤项目的呈现。我已经构建了我的辅助函数来返回该间隔期间内的所有交易,但我无法在我的一生中正确构建将在索引页面顶部返回 dateTime 值和整数值的表单?

有什么想法吗?我是否必须构建一个单独的模型对象来为其赋值,还是有更简单的方法?

【问题讨论】:

    标签: ruby-on-rails ruby forms


    【解决方案1】:

    在您的索引页面上,您可以创建一个像这样的过滤器表单

    <%= form_tag '', :method => :get do %>
      <%= text_field_tag :value_one %>
      <%= text_field_tag :value_two %>
      <%= submit_tag 'Filter' %>
    <% end %>
    

    然后,您的表单将使用查询字符串参数在您的页面上执行 GET,然后您可以在控制器中查找可能已传递的过滤器参数。

    【讨论】:

    • 如果你想在 URL 中省略&amp;commit=Filter,你可以写&lt;%= submit_tag 'Filter', name: nil %&gt;
    【解决方案2】:

    我喜欢在我的控制器中逐渐构建一个过滤器,即:

    def index
    
      filter = []
    
      if params.has_key?("filter")
    
        if !params[:filter][:user_id].blank?
          id = params[:filter][:user_id]
          filter << ["user_id = #{id.to_i}"]
        end
    
        if !params[:filter][:project_id].blank?
          id = params[:filter][:project_id]
          filter << ["project_id = #{id.to_i}"]
        end
    
        if !params[:filter][:change_type_id].blank?
          id = params[:filter][:change_type_id]
          filter << ["change_type_id = #{id.to_i}"]
        end
    
      end
    
      @logs = LogEntry.where(filter.join(" AND ")).order('created_at DESC')    
    
    end
    

    如果您的视图中没有选择过滤器(我使用select_tag 表单助手),您的数据库查询将返回所有记录。

    【讨论】:

    • 我喜欢这种方法(这是问题答案的第二部分!)。也许用params[...].present? 代替!params[...].blank? 更漂亮。
    • 其实你不必像这样逐步构建过滤器,而是应该逐步构建一个活动记录查询,通过针对各种条件调用where语句逐步缩小结果集。 Rails 足够聪明,即使您多次调用 LogEntry 模型,也可以在一条语句中执行所有操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 2017-12-02
    • 2012-08-02
    • 2011-02-19
    相关资源
    最近更新 更多