如何使用simple_form创建表单来控制视图中的范围(通过has_scope)

时间:2016-01-07 19:49:50

标签: ruby-on-rails ruby-on-rails-4 simple-form has-scope

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

控制器中的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 %>

示例输出网址:

  

... /分析/学校UTF8 =✓&安培;滤波器%5BY%5D = 2016&安培;滤波器%5Bdiscipline_id%5D = 2及滤波器%5Bcompetency_id%5D = 2及滤波器%5Btype_id%5D = 1&安培;提交=过滤

所需的输出网址:

  

... /分析/学校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创建表单。

(+)网址信息更清晰 ( - )代码更乱,更狡猾 ( - )这似乎是hacky

我已经搜索了很多内容,我很惊讶我没有遇到过与has_scope一起创建表单变得容易的东西。

请不要使用上述解决方案之一!谢谢!

1 个答案:

答案 0 :(得分: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