2

基本上,我无法弄清楚如何防止表单生成器将所有内容封装在哈希(filter {...})中,从而使表单可以轻松设置视图范围中使用的参数。

控制器中的 has_scope 代码:

has_scope :degree_id
has_scope :discipline_id
has_scope :competency_id
has_scope :type_id
has_scope :year

视图中的 simple_form 代码:

<%= simple_form_for :filter, url: analyze_school_path, method: :get do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :y, label: 'Year', collection: @years, include_blank: '- Year -' %>
    <%= f.input :discpline_id, label: 'Discipline', collection: Discipline.all, include_blank: '- Discipline -' %>
    <%= f.input :competency_id, label: 'Competency', collection: Competency.all, include_blank: '- Competency -' %>
    <%= f.input :type_id, label: 'Type', collection: JobType.all, include_blank: '- Type -' %>
  </div>

  <div class="form-actions">
    <%= f.button :submit, 'Filter', class: "btn btn-primary" %>
  </div>
<% end %>

示例输出 URL:

.../analyze/school?utf8=✓&filter%5By%5D=2016&filter%5Bdiscipline_id%5D=2&filter%5Bcompetency_id%5D=2&filter%5Btype_id%5D=1&commit=Filter

所需的输出网址:

.../analyze/school?y=2016&discipline_id=2&competency_id=2&type_id=1

第一个解决方案:只需遍历哈希并设置范围使用的参数。

(+) 这行得通,而且相当简单 (-) URL 仍然很乱 (-) 这看起来很hacky

params[:filter].each do |k,v|
   params[k] = v
end

解决方案 2:使用纯 HTML 创建表单。

(+) URL 信息更清晰 (-) 代码更混乱更脆弱 (-) 这看起来很老套

我用 Google 搜索了很多,很惊讶我没有遇到可以轻松创建与 has_scope 一起使用的表单的东西。

请让我不必使用上述解决方案之一!谢谢!

4

1 回答 1

1

我认为您可以通过 rails 使用简单的 form_tag:

在这里查看更多信息:http: //guides.rubyonrails.org/form_helpers.html

或者只是实现一个方法,如

def parse_filter_params
  params.merge!(params[:filter]) if params[:filter]
end

并在您想要的每个操作之前应用它:

before_action :parse_filter_params
于 2016-03-07T19:20:49.400 回答