【问题标题】:Rails: Photo uploads (Paperclip) with nesting & strong paramsRails:带有嵌套和强参数的照片上传(Paperclip)
【发布时间】:2013-05-09 13:38:26
【问题描述】:

背景:

我正在尝试使用带有 Paperclip gem 的 Strong Params 将照片上传添加到 Advert 模型,其中 Photo 是一个单独的模型,其中“has_attached_file”:upload,我正在调用 forms_for(实际上是 semantic_forms_for,因为我正在使用 Formtastic ) 在 Ads#new 视图中将图像上传到 Photo 实例。参数看起来不错,但我想我错过了控制器中的一些东西。尽管对控制器代码进行了多次迭代,但仍无法使其工作。我需要做些什么不同的事情才能让它发挥作用?

不胜感激任何提示或指示!谢谢

--

广告模式:

class Ad < ActiveRecord::Base
  belongs_to :user

    ##edited out irrelevant associations

  has_many :photos, dependent: :destroy
  accepts_nested_attributes_for :photos, :allow_destroy => true
  default_scope { order("created_at DESC") }
  #validates_presence_of :user_id, :make, :model, :km, :year, :location
end

--

照片模型:

 class Photo < ActiveRecord::Base
      belongs_to :ad
      has_attached_file :upload, :styles => { :main => "600x500>", 
                                                                                    :thumb => "60x45>" }, 
      :default_url => "http://placehold.it/600x500&text=nice+wheels!"
    end

广告控制器

class AdsController < ApplicationController

    def create
        @ad = Ad.new(ad_params)
      @ad.user_id = current_user.id
      @photo = @ad.photos.build
        if @ad.save
            redirect_to @ad
        else
            flash.alert="You were missing some super-important details. Try again"
            redirect_to new_ad_path
        end
    end

    private

    def ad_params ##excluded all attributes except nested upload attrib. for gist
        params.require(:ad).permit(photos_attributes: [upload: [:upload_file_name, :upload_content_type]])
    end

end

广告#new

 <%= semantic_form_for @ad do |form| %>

    <!-- left out all other form fields -->      

      <%= form.semantic_fields_for :photo do |photo| %>
        <%= photo.file_field :upload %>
      <% end %>

    <% end %>

提交操作后的广告参数哈希 (Ad#create)

{"location":"Abha","make":"Bentley","model":"","gear":"","km":"50","price_bid":"500","price_ask":"500","ac":"0","cd":"0","radio":"0","powersteering":"0","abs":"0","satnav":"0","cruise":"0","fwd":"0","convertible":"0","problem_1":"","problem_2":"","problem_3":"","description":"","photo":{"upload":{"original_filename":"mustang-290x218.jpg","content_type":"image/jpeg","headers":"Content-Disposition: form-data; name=\"ad[photo][upload]\"; filename=\"mustang-290x218.jpg\"\r\nContent-Type: image/jpeg\r\n","tempfile":[]}}}

路线

resources :ads, only: [:new, :create, :show, :index, :edit, :destroy] do
        resources :comments, only: [:create, :destroy]
        resources :photos, only: [:create, :destroy]
        resources :favorite_ads, only: [:create, :destroy]
        resource :emails, only: :create 
  end

【问题讨论】:

    标签: ruby-on-rails file-upload paperclip nested-forms strong-parameters


    【解决方案1】:

    需要将表单指定为多部分才能进行文件上传:

    <%= semantic_form_for @ad, :html => {:multipart => true} do |form| %>
    

    此外,您不允许传递临时文件:

    params.require(:ad).
           permit(photos_attributes: 
                   [upload: 
                     [:upload_file_name, :upload_content_type, :tempfile]
                   ])
    

    【讨论】:

    • 非常感谢您的回答,我试过了,但仍然得到相同的结果......上传已经在没有 multipart = true 的情况下工作(我认为这在 Rails 3.2+ 中是正确的,包括上传字段自动设置这个?)。允许 :tempfile 是有道理的,但似乎并没有解决问题。我想知道这是否与我如何保存新的照片实例有关...
    【解决方案2】:

    params.require(:ad).permit(photos_attributes: :upload)

    这应该足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 2012-08-30
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多