Carrierwaveを使用して処理される写真のアップロードにポリモーフィックな関連付けを設定しようとしています。SimpleFormを使用してフォームを作成しています。関連付けが正しいように感じるので、私の問題はフォームまたはコントローラーの問題にすぎないのではないかと思います。
これが私の協会です:
property.rb:
class Property < ActiveRecord::Base
attr_accessible :image
...
has_many :image, :as => :attachable
...
end
unit.rb
class Unit < ActiveRecord::Base
attr_accessible :image
...
has_many :image, :as => :attachable
end
image.rb
class Image < ActiveRecord::Base
belongs_to :attachable, :polymorphic => true
mount_uploader :image, PhotoUploader
end
property_controller.rb:
def edit
@property = Property.find params[:id]
@property.image.build if @property.image.empty?
end
def update
@property = Property.find params[:id]
if @property.update_attributes params[:property]
redirect_to admin_properties_path, :notice => 'The property has been successfully updated.'
else
render "edit"
end
end
プロパティ/_form.html.erbからのスニペット
<%= f.input :image, :label => 'Image:', :as => :file %>
画像を添付して送信するとエラーが発生します。
undefined method `each' for #<ActionDispatch::Http::UploadedFile:0x00000102291bb8>
そしてここにパラメータがあります:
{"utf8"=>"✓",
"_method"=>"put",
"authenticity_token"=>"lvB7EMdc7juip3gBZD3XhCLyiv1Vwq/hIFdb6f1MtIA=",
"property"=>{"name"=>"Delaware Woods",
"address"=>"",
"city"=>"",
"state"=>"",
"postal_code"=>"",
"description"=>"2 bedroom with large kitchen. Garage available",
"incentives"=>"",
"active"=>"1",
"feature_ids"=>[""],
"user_ids"=>[""],
"image"=>#<ActionDispatch::Http::UploadedFile:0x00000102291bb8 @original_filename="wallpaper-4331.jpg",
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"property[image]\"; filename=\"wallpaper-4331.jpg\"\r\nContent-Type: image/jpeg\r\n",
@tempfile=#<File:/tmp/RackMultipart20120608-3102-13f3pyv>>},
"commit"=>"Update Property",
"id"=>"18"}
私はどこでもポリモーフィックな関連についての助けを探していますが、どこにも行きません。私はかなり簡単に見える簡単な例を見てきました。私が気づいたことの1つは、多くの例で、私の場合のhas_manyアソシエーションはそうであるべきであり、そうではないように思われることimages
ですimage
。ただし、これを行うとエラーが発生します。
Can't mass-assign protected attributes: image
次のような他のブログで見たように、fields_forを使用するようにフォームを更新しようとしました。
<%= f.input :image, :label => "Photo", :as => :file %>
<% f.simple_fields_for :images do |images_form| %>
<%= images_form.input :id, :as => :hidden %>
<%= images_form.input :attachable_id, :as => :hidden %>
<%= images_form.input :attachable_type, :as => :hidden %>
<%= images_form.input :image, :as => :file %>
<% end %>
私が知っているのは、これを機能させるのにかなりの時間がかかっているということだけです。私はRailsにかなり慣れていないので、デバッグすることさえ困難です。3.2でデバッガーが実際に機能しないことは役に立ちません:(