为动态密钥配置强参数

时间:2016-12-18 11:12:27

标签: ruby-on-rails ruby-on-rails-4 form-for strong-parameters

我正在尝试提供一个表单,允许管理员编辑特定模型Submission的所有值,几乎就像电子表格一样。 Submission由一个字符串字段:domain组成。

问题是我无法弄清楚如何在这种情况下处理强对手。我已经找到了处理像this one这样的动态键的类似例子,但是我无法弄清楚如何将它们应用到我的参数结构中。我想我对tap的工作方式还不够清楚。

以下是我的参数示例:

{"3"=>{"domain"=>"domain3"}, "2"=>{"domain"=>"domain2"}, "1"=>{"domain"=>"domain1"}

如果它有帮助,这是我正在使用的表格:

<%= form_tag update_multiple_submissions_path, method: :put do %>
    <table data-toggle="table" data-sort-name = "domain" data-sort-order = "desc">
        <thead>
            <th data-field="domain" data-sortable="true">Domain</th>
        </thead>
        <tbody>
            <% @submissions.each do |submission| %>
                <%= simple_fields_for "submissions[]", submission, defaults: {label: false} do |f| %>
                    <tr>
                        <td><%= submission.domain %><%= f.input :domain %></td>
                    </tr>
                <% end %>
            <% end %>
        </tbody>
    <table>
    <%= submit_tag "Save" %>
<% end %>

如果你很好奇,这是我控制器的update_multiple方法。如果这看起来很熟悉,我从一个railscast获得了轮廓,这在rails3中非常有效,然后强大的params(无论如何?)无处不在。

  def update_multiple
    logger.debug "update_multiple #{submission_params}"
    @submissions = Submission.update(submission_params[:submissions].keys, params[:submissions].values)

    flash[:notice] = "Updated Submissions"

    redirect_to review_submissions_path
  end

如果我使用params.permit!完全绕过强大的婴儿车,这非常有效,但当然,这是一个不可接受的解决方案。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以使用&#34;虚拟&#34; model(没有表格的模型):

class SubmissionFormCollection
  include ActiveModel::Model

  attr_accessor :submissions
end
def edit_multiple
  @collection = SubmissionFormCollection.new(
    Submission.all
  )
end
<% simple_form_for(@collection, as: :some_param_key, path: update_multiple_submissions_path, method: :put) do |f| %>
  <%= f.fields_for(:submissions) do |s| %>
    <%= s.input :domain %></td>
  <% end %>
<% end %>
params.require(:some_param_key)
      .permit(submissions: [:domain])

虽然我可能会使用ajax并将其作为一系列原子PATCH请求来编辑,因为它会提供直接的用户反馈和更好的API。