【发布时间】:2017-11-07 17:52:01
【问题描述】:
我很难把它消化成一个标题。
我正在使用 SimpleForm 构建一个包含一个或多个字段集的批量编辑页面 - 一个用于已构建但尚未保存的 ActiveRecord 模型集合中的每条记录。
我的表单如下所示:
= simple_form_for :courses, method: :patch do |f|
- @courses.each do |course|
= field_set_tag do
= f.simple_fields_for 'courses[]', course do |c|
= c.input :title
.row
.medium-6.columns
= c.input :start_date, as: :string, input_html: { class: 'input-datepicker' }
.medium-6.columns
= c.input :end_date, as: :string, input_html: { class: 'input-datepicker' }
= f.submit 'Save', class: 'primary button'
一条记录的参数哈希如下所示:
"courses"=>{"courses"=>[{"title"=>"Course Y", "start_date"=>"2017-09-26", "end_date"=>"2017-07-31"}]}
使用一个数组,而对于两条记录,它看起来像这样:
"courses"=>{"courses"=>{"1"=>{"title"=>"Course X", "start_date"=>"2018-01-16", "end_date"=>"2018-07-30"}, "2"=>{"title"=>"Course Y", "start_date"=>"2017-09-26", "end_date"=>"2018-07-30"}}}
使用字符串整数键控哈希。
当我尝试使用强参数时,这会成为一个问题。经过多次黑客攻击,我最终得到了这段代码,它适用于多条记录,但仅在提交一条时失败:
ActionController::Parameters
.new(courses: params[:courses][:courses].values)
.permit(courses: [:title, :start_date, :end_date])
.require(:courses)
它失败,param is missing or the value is empty: courses 突出显示上面的 .require(:courses) 行。
通过协调单记录情况与多记录情况来“解决”问题:
if params[:courses][:courses].is_a?(Array)
params[:courses][:courses] = { '1': params[:courses][:courses][0] }
end
但感觉应该有更简单的方法。
有没有更好的方法来为这个用例编写表单?我错过了具有强参数的技巧吗?
我正在使用rails 5.0.5 和simple_form 3.5.0。
【问题讨论】:
-
有点摸不着头脑,但如果将
= f.simple_fields_for 'courses[]', course do |c|替换为= f.simple_fields_for :courses, course do |c|,可能会导致每次都使用相同类型的参数散列。 -
"但感觉应该有更简单的方法。" - 是的,使用 ajax 发送单独的创建/更新请求。
-
但是您可以使用
.fetch而不是.require,但它仍然会导致无法维护的混乱。 -
@TomAranda 我想我们已经尝试过了——它只会导致页面上的最后一个字段集被提交
标签: ruby-on-rails ruby simple-form simple-form-for