【问题标题】:Rails 4 | Unpermitted parameter: images when using Paperclip to upload multiple images using Paperclip form导轨 4 | Unpermitted 参数:使用 Paperclip 上传多张图片时使用 Paperclip 表单时的图片
【发布时间】:2017-07-13 15:19:53
【问题描述】:

在我的表单中使用简单表单从回形针上传多个图像时,遇到了强大的参数。我经常在服务器上弹出错误

“不允许的参数:图像”

当表单尝试上传到数据库时。好的,这就是我到目前为止所得到的。

表格代码:

<%= f.input :images, as: :file, input_html: { multiple: true } %>

办公桌控制器:

def new
    @desk = current_user.desks.build

    @desk.office_type_id = params[:office_type_id]
    @desk.desk_type_id = params[:desk_type_id]

    @amenities = Amenity.all
    @desk.amenity_ids = params[:amenities]

end

def create
    @desk = current_user.desks.build(desk_params)


    if @desk.save

        if params[:images]
            params[:images].each do |image|
                @desk.photos.create(image: image)
            end
        end

        @photos = @desk.photos
        redirect_to edit_desk_path(@desk), notice: "Saved..."
    else
        render "new"
    end
end


private
    def set_desk
        @desk = Desk.find(params[:id])
    end

def desk_params
    params.require(:desk).permit(:office_type_id, :desk_type_id, 
        :office_type, :desk_type, :listing_name, :min_days, :max_days, 
        :accommodate, :daily_rate, :location, :description, :amenities, 
        amenity_ids: [], 
        :photos_attributes => [ :images ])
end

我有一个照片模型:

class Photo < ActiveRecord::Base
    belongs_to :desk

    has_attached_file :image, styles: { medium: "300x300>", thumb: "100x100>" }
    validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/
end

桌面型号:

    has_many :photos

我尝试将 .., :images 和 .., :images => [] 列入白名单,

都没有成功。我确定我已经尝试过其他组合,这些组合将允许一个数组进入组合。

值得注意的一点是多张图片上传的服务器代码示例显示了一个数组被拉入参数。示例:

Processing by DesksController#update as HTML


 Parameters: {"utf8"=>"✓", "authenticity_token"=>"hgEIE6yirx7ixY8Xs0mUxA+6G3wmy/D4wKSLKrF+clTfzvpunFG11PmEfI2l3bPV0IlCywdmvajshMph7c5V+A==", "desk"=>{"office_type_id"=>"1", "desk_type_id"=>"1", "accommodate"=>"1", "min_days"=>"1", "max_days"=>"2", "listing_name"=>"1111", "description"=>"111", "location"=>"111", "daily_rate"=>"100", "amenity_ids"=>["2", "3", ""], "images"=>[#<ActionDispatch::Http::UploadedFile:0x007fba71ce2880 @tempfile=#<Tempfile:/var/folders/gx/86yj74bx3md88cfn2fwc975h0000gn/T/RackMultipart20170713-20588-1bin85a.JPG>, @original_filename="IMG_1420.JPG", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"desk[images][]\"; filename=\"IMG_1420.JPG\"\r\nContent-Type: image/jpeg\r\n">, #<ActionDispatch::Http::UploadedFile:0x007fba71ce2268 @tempfile=#<Tempfile:/var/folders/gx/86yj74bx3md88cfn2fwc975h0000gn/T/RackMultipart20170713-20588-1ac6bwu.JPG>, @original_filename="IMG_1421.JPG", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"desk[images][]\"; filename=\"IMG_1421.JPG\"\r\nContent-Type: image/jpeg\r\n">]}, "commit"=>"Update Desk", "id"=>"37"}

这非常令人沮丧。希望对这里发生的事情有任何帮助或指导。我确信这可能是一个嵌套问题,但仍然无法让它与当前代码一起使用。万分感谢。

【问题讨论】:

    标签: ruby-on-rails-4 paperclip simple-form strong-parameters


    【解决方案1】:

    好的,在@irldexter 和@pavan 的帮助下,我最终弄清楚了问题所在。他们提出了一些不太正确的建议,但绝对帮助我最终解决了问题。我已经添加了一个答案,以将它们放在一起。

    因此,当我研究 rails_form 和 simple_form 发送参数的方式时,我注意到的问题是,每个标题中的 html 名称都不同。我还注意到,由于这个 simple_form 将图像包含在我的桌面=>{} 中,而不是将其分离到自己的数组中。

    简单形式(不工作)

    Parameters: {"utf8"=>"✓", 
    "authenticity_token"=>"1c3dbJYJWuPs3L95F2eqkxm8Fuwr5J3D5LdEyRLeS7sAYgnbhEBIcfsE1A4Hw2rQy8zbZEdr6mMcZTjUGH3Cpg==", 
    "desk"=>{"listing_name"=>"Dublin Desk Image", 
    "description"=>"Desk in Dublin", 
    "accommodate"=>"1", 
    "price"=>"100", 
    
    "images"=>#<ActionDispatch::Http::UploadedFile:0x007fce7cf618d0 @tempfile=#<Tempfile:/var/folders/gx/86yj74bx3md88cfn2fwc975h0000gn/T/RackMultipart20170718-1255-luxbhv.JPG>,
    @original_filename="IMG_1421.JPG", 
    @content_type="image/jpeg", 
    @headers="Content-Disposition: form-data; name=\"desk[images]\"; 
    filename=\"IMG_1421.JPG\"\r\nContent-Type: image/jpeg\r\n">},
    
     "commit"=>"Create Desk"
    

    Rails 窗体(工作)

        Parameters: {"utf8"=>"✓", 
    "authenticity_token"=>"8YqUPPx9qumESGiSjkZCtxunFPsdeFed+pXmamWKwmY8jfwRXXCNDTUSJOdfT9R2b13NLOOGyqo3gOiP8FE08Q==", 
    
    "office"=>{
    "office_type"=>"Private", "desk_type"=>"Corporate", "accommodates"=>"2", "min_hours"=>"3", "max_hours"=>"2", "listing_name"=>"image test", "summary"=>"rgerg", "address"=>"grafton street, dublin 1", "is_aircon"=>"1", "is_elevator"=>"0", "is_showers"=>"0", "is_changing_room"=>"0", "is_printer"=>"1", "is_kitchen"=>"0", "is_telephone"=>"0", "is_desktop_computer"=>"0", "is_coffee_machine"=>"0", "is_meeting_room"=>"0", "is_wifi"=>"0", "price"=>"123", "active"=>"1"}, 
    
    "images"=>[#<ActionDispatch::Http::UploadedFile:0x007fbeef60fa08 @tempfile=#<Tempfile:/var/folders/wj/p88yb82j39x40kgcm1qg24g00000gn/T/RackMultipart20170718-96629-11meflg.jpg>, @original_filename="benjamin-child-17946.jpg", 
    @content_type="image/jpeg", 
    @headers="Content-Disposition: form-data; name=\"images[]\"; 
    filename=\"benjamin-child-17946.jpg\"\r\nContent-Type: image/jpeg\r\n">], 
    
    "commit"=>"Save"}
    

    当我重新创建问题时,简单的表单内容被简化了。我需要在 simpleform 代码中以某种方式更改 name= 。当我意识到问题时,就这么简单。

    <%= f.input :images, as: :file, input_html: { name: 'images[]' } %>
    

    强参数,只要调用就可以了

        def desk_params
            params.require(:desk).permit(:listing_name, :description, :accommodate, :price, :active, :images)
        end
    

    我还注意到,由于代码正在运行,所以找不到参数肯定有一些问题

    if params[:images]
            params[:images].each do |image|
                @desk.photos.create(image: image)
            end
        end
    

    当我添加 put 消息时的代码,以查看它是否返回真值。我还在 Desk 模型中添加了

    accepts_nested_attributes_for :photos
    

    最终解决起来很容易,这只是因为提到了网络标头,并且可能以简单的形式使用了 f.input_field,它删除了任何表单包装器以及名称:change 方法。感谢@pavan @irldexter 的帮助和建议。它帮助我更多地了解发送的实际表单数据。非常尊重。

    【讨论】:

      【解决方案2】:

      桌面模型应该包含一些允许它创建照片对象的东西,例如:

      has_many :photos
      accepts_nested_attributes_for :photos
      

      Desk Controller 不仅应该包括一组照片 ID 的潜力,还应该包括创建照片 ID 所需的特定属性,默认是一个 ID,然后是一个作为附件的图像:

      def desk_params
          params.require(:desk).permit(:office_type_id, :desk_type_id, 
              :office_type, :desk_type, :listing_name, :min_days, :max_days, 
              :accommodate, :daily_rate, :location, :description, :amenities, 
              amenity_ids: [], photo_ids: [], photo_attributes: [ :id, :image ])
      end
      

      我会在视图/控制器逻辑中使用参数param[:photo_ids],而不是desk 上的images,以避免混淆并映射关系。

      另外,建议您查看开发日志中有关未经许可的参数的内容,并查看浏览器控制台中的参数以准确了解尝试发布的内容。

      在您的 rails 控制台中(因为我看不到您的架构,可能是输出):

      Desk.column_names
      

      Photo.column_names
      

      确认您的参数并检查所需的模型/架构,并且不能为空(如果null =&gt; false,则没有默认值)

      【讨论】:

      • 嗨@irldexter,尝试了上述更改。参数限制没有错误但是在控制器中 if params[:photo_ids] params[:photo_ids].each do |image| @desk.photos.create(image: image) end end ****** 返回了一个错误,所以它没有运行 If 语句。出于某种原因,参数作为索引拉入,但在参数中调用它不起作用。
      • 确认@Bradley 假设您还更改了视图/表单以反映?你能在 Chrome 开发者工具/网络/标题中看到参数的样子吗?...回想起来,你可能会逃脱 &lt;%= f.input_field :photos, ...
      【解决方案3】:

      不允许的参数:图像

      当您查看 params 哈希时,您没有 photos_attributes 键。 images: [] 直接进入办公桌内。所以你需要将desk_params修改为下面

      def desk_params
        params.require(:desk).permit(:office_type_id, :desk_type_id, 
        :office_type, :desk_type, :listing_name, :min_days, :max_days, 
        :accommodate, :daily_rate, :location, :description, :amenities, 
        amenity_ids: [], images: [])
      end
      

      【讨论】:

      • 嗨,帕万,我试过调用图像:参数中的一个数组,但这仍然会吐出未经允许的参数。有趣的是,如果它与 rails 形式而不是简单形式一起使用,一切似乎都可以正常工作。它只是涉及简单形式的代码,它不想玩得很好。
      • @Bradley 尝试将 &lt;%= f.input :images, as: :file, input_html: { multiple: true } %&gt; 更改为 &lt;%= f.input :images, as: :file, input_html: { multiple: true }, name: "desk[images][]"%&gt;
      • 嗨 Pavan,谢谢,但我现在收到错误“ActiveRecord::UnknownAttributeError(Desk 的未知属性'图像'。)”我在参数中最后输入了 :images[]。不知道为什么不允许它们进入,我还在我的 Desk 模型中添加了 accept_nested_attributes_for :photos。
      猜你喜欢
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2014-11-10
      • 1970-01-01
      • 2018-03-26
      • 2019-11-09
      • 2011-09-21
      相关资源
      最近更新 更多