Rails - 用于多个文件上载的双嵌套表单的隐藏字段导致错误

时间:2016-04-02 16:27:28

标签: ruby-on-rails forms

我有一个双嵌套形式:

<%= simple_form_for @item, html: { class: "create-item-form" } do |item_builder| %>
  <div class="well">
  <%= item_builder.input :name, required: false, error: false, label: "item name" %>
  <%= item_builder.input :description, as: :text, required: false, error: false, label: "How do users earn this item?" %>
  <%= item_builder.input :tag_list, required: false, label: "Tag suggestions (these will help users find your item)" %>
  <%= item_builder.simple_fields_for :user_items do |user_item_builder| %>
    <%= user_item_builder.input :foo, as: :hidden, input_html: { value: "bar" } %>

    <%= user_item_builder.simple_fields_for :user_item_images do |user_item_images_builder| %>
      <%= user_item_images_builder.input :foo, as: :hidden, input_html: { value: "bar" } %>
      <%= user_item_images_builder.input :picture, as: :file, required: false,
                error: false, label: "Pictures of you earning this item",
                input_html: { multiple: true,
                              name: "item[user_items_attributes][0][user_item_images_attributes][][picture]" } %>
      <% end %>
  <% end %>
  </div>
  <div class="clearfix">
    <%= item_builder.submit 'Submit new item request', class: "btn btn-primary pull-right inherit-width" %>
  </div>
<% end %>

使用创建操作:

  def create
    @item = item.new item_params
    raise 'foo'
    @item.user_items.first.user_id = current_user.id
    if @item.save
      redirect_to items_path, notice: "Thank you for your item request!""
    else

      render :new
    end
  end

和新动作:

 def new
    @item = Item.new
    @user_item = @item.user_items.build
    @user_item.user_item_images.build
  end

和strong_params

def item_params
  params.require(:item).permit(:name, :description, :tag_list, user_items_attributes: [user_item_images_attributes: [:user_item_id, :picture]]).merge(created_by: current_user.id)
end

当我添加多个文件并在开发中提交表单时,我只得到一个空白页面,但在服务器控制台中我收到此错误。

  

ActionController :: BadRequest(无效的请求参数:期望的数组(得到了Rack :: Utils :: KeySpaceConstrainedParams),用于参数`user_item_images_attributes&#39;)

如果我删除第二个隐藏字段,则表单有效。但是,当表单验证失败并再次呈现时,我最终会为每个添加的文件输入文件。这就是隐藏字段开始的原因。第一个隐藏字段运行良好,但当它到达第二个嵌套表单时,它会导致问题。

更新:

我改变了这一行

<%= user_item_builder.simple_fields_for :user_item_images do |user_item_images_builder| %>

到这个

<%= user_item_builder.simple_fields_for 'user_item[user_item_images_attributes][]', :user_item_images do |user_item_images_builder| %>

它有效。我真的不知道为什么。如果有人想解释并将其写入答案,我会给你信任。

0 个答案:

没有答案