1

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でデバッガーが実際に機能しないことは役に立ちません:(

4

1 に答える 1

3

モデルには:imagesがあります(:imageではなく:imagesである必要があります)ので、ビューでnested_formsを使用することをお勧めします。ユニットモデルとプロパティモデルにaccepts_nested_attributes_for:imagesを設定し、attr_accessibleを:imageから:image_attributesに変更する必要があります。

http://railscasts.com/episodes/196-nested-model-form-part-1をチェックして、それを実行するための優れたガイドを確認してください。

于 2012-06-12T19:29:49.487 に答える