Rails 4 |未允许的参数:使用Paperclip使用Paperclip表格上传多个图像时的图像

时间:2017-07-13 15:19:53

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

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

"未经许可的参数:图像"

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

表格代码:

<%= 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 =&gt; [],

既不成功。我确定我已经尝试过其他可以让阵列融入其中的组合。

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

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"}

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

3 个答案:

答案 0 :(得分:1)

好的,所以我最终在@irldexter和@pavan的帮助下找出了问题所在。他们提出了不太正确的建议,但最终帮助我弄清了问题。我已经添加了一个答案,让它们保持在一起。

所以当我查看rails_form和simple_form这两个参数发送方式时,我注意到的问题是标题中的html名称各不相同。我还注意到,因为这个simple_form包含了我桌面上的图像=&gt; {}而没有把它分成自己的数组。

简单形式(不工作)

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代码中以某种方式更改名称=。当我意识到这个问题时,就像这一样容易。

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

强参数只需调用

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

我还注意到,由于代码运行

,因此找不到params的问题
if params[:images]
        params[:images].each do |image|
            @desk.photos.create(image: image)
        end
    end
当我添加put消息以查看它是否返回true值时的

代码。我还在Desk模型中添加了

accepts_nested_attributes_for :photos

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

答案 1 :(得分:0)

桌面模型应包含允许其创建照片对象的内容,例如:

has_many :photos
accepts_nested_attributes_for :photos

和桌面控制器不仅应包括照片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]而不是images上的desk,以避免混淆并映射关系。

另外,建议您查看开发日志在不允许的参数方面的内容,并查看浏览器控制台中的参数,以确切了解尝试发布的内容。

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

Desk.column_names

Photo.column_names

确认你的参数,并检查所需的模型/模式,不能为空(如果null => false,则没有默认值)

答案 2 :(得分:0)

  

未经许可的参数:图片

当您查看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