【问题标题】:Rails 4 - Unpermitted parameters for nested param despite whitelistingRails 4 - 尽管列入白名单,但嵌套参数的不允许参数
【发布时间】:2016-02-25 00:44:21
【问题描述】:

我有两个型号user_itemuser_item_images

schema.rb

  create_table "user_item_images", force: :cascade do |t|
    t.integer  "user_item_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "picture"
  end

  create_table "user_items", force: :cascade do |t|
    t.integer  "user_id"
    t.integer  "item_id"
    t.integer  "status",          default: 0
    t.boolean  "hide_banner",     default: false
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "picture"
    t.string   "declined_reason"
  end

我有一个表单,用户应该在其中提交一个新的user_item。表单中唯一的字段是用户可以上传多张图片的图片。成功后,将创建一个新的user_item,并为每张上传的图片创建一个新的user_item_image

表格

    <%= simple_form_for :user_item, url: user_items_path, html: {multipart: true} do |user_item_builder| %>
      <%= user_item_builder.input :item_id, as: :hidden, input_html: { value: "#{@item.id}" } %>
      <%= user_item_builder.simple_fields_for :user_item_images do |user_item_images_builder| %>
        <%= user_item_images_builder.input :picture, as: :file, label: false, name: "user_item_images[picture][]", input_html: { multiple: true } %>
      <% end %>
    <% end %>

user_item_controller.rb

  def create
    @user_item = current_user.user_items.new(user_item_params)
    raise 'foo'
    if @user_item.save
      params[:user_item][:user_item_images]['picture'].each do |a|
        @user_item_image = @user_item.user_item_images.create!(:picture => a)
      end
      # Sends email to user when item request is created.
      itemMailer.user_item_submission_email(current_user, @user_item.item).deliver_later

      flash[:notice] = "Thank you for your item request!"
    else
      @user_item.errors.full_messages.each do |message|
        flash[:alert] = message
      end
    end

    redirect_to item_path(@user_item.item)
  end

  private 

  def user_item_params
    params.require(:user_item).permit(:item_id, user_item_images_attributes: [:user_item_id, :picture])
  end

user_item.rb

  belongs_to :user
  has_many :user_item_images
  mount_uploader :picture, PictureUploader

  accepts_nested_attributes_for :user_item_images

user_item_image.rb

  mount_uploader :picture, PictureUploader
  belongs_to :user_item

当我提交表单时,我在控制台中收到Unpermitted parameter: user_item_images,但我不知道为什么。

【问题讨论】:

    标签: ruby-on-rails activerecord strong-parameters


    【解决方案1】:

    改变这个:

        <%= ..., name: "user_item_images[picture][]", ... %>
    

    到这里:

        <%= ..., name: "user_item_images_attributes[picture][]", ... %>
    

    【讨论】:

    • 我进行了更改,我的 html 看起来像这样&lt;input multiple="multiple" class="file required" type="file" name="user_item[user_item_images][picture][]" id="user_item_user_item_images_picture"&gt;。不应该不一样吗?
    • 啊,我在使用 simple_form 时需要更改语法
    • 我是否需要将其列入白名单,因为我只是使用参数来创建 user_item_picture 对象?
    • 您在#create 的第一行使用params(通过user_item_params)来创建UserItem,这也是accepts_nested_attributes_for :user_item_images。这就是导致错误消息的原因,也是您需要将user_item_images_attributes 列入白名单的原因。
    • 您需要更改inputname 的原因是accepts_nested_attributes_for :foo 查找params[:foo_attributes] 中的值,而不是params[:foo]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    相关资源
    最近更新 更多