为动态密钥配置强参数
Configuring strong parameters for dynamic keys
我正在尝试提供一种允许管理员编辑特定模型 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 中非常有效。
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!
完全绕过坚固的婴儿车,这会非常有效,但是,当然,这是一个不可接受的解决方案。
感谢您的帮助!
您可以使用 "virtual" 模型(没有 table 的模型):
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。
我正在尝试提供一种允许管理员编辑特定模型 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 中非常有效。
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!
完全绕过坚固的婴儿车,这会非常有效,但是,当然,这是一个不可接受的解决方案。
感谢您的帮助!
您可以使用 "virtual" 模型(没有 table 的模型):
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。