1

ユーザーがマイクロポスト (基本的にはステータスの更新) を投稿し、マイクロポストと一緒に写真をアップロードできるシステム設定があります。

私は持っている:

マイクロポスト モデル (has_one photo) Photo_album モデル (has_many photos) 写真モデル (belongs_to micropost、belongs_to photo_album)

ユーザーはテキスト領域にテキストを入力し、写真を選択します。送信すると、マイクロポスト テーブルはコンテンツ、created_at などのマイクロポスト関連データで更新されます。

同時に、ユーザーが選択した写真を使用して写真テーブル (写真モデル) を更新したいのですが、正しい写真アルバムが必要です。以下を見ると、users_controller でインスタンス変数 @photo の値を見ることができます。これにより、アップロードされた写真が「マイクロポスト アルバム」という名前の正しいフォト アルバムにリンクされます。その目的は、すべてのマイクロポスト関連の写真にリンクすることです。

私はUsers_controllerを持っています:

  def new
     @user = User.new 
     @micropost = Micropost.new(:user_id => users_id)
     @photo = Photo.new(:photo_album_id => PhotoAlbum.where(:user_id => current_user.id, :album_title => "microposts album").first.id)
  end

以前の質問から、1 つのフォームで複数のモデルを更新できるようにするには、accepts_nested_attributes_for、fields_for を使用する必要があることが確認されました。これが私が設定した方法です。

マイクロポスト モデル:

class Micropost < ActiveRecord::Base

  belongs_to :user
  has_one  :photo
  accepts_nested_attributes_for :photo
  attr_accessible :content, :user_id, :poster_id, :username, :image, :remote_image_url

end

写真のモデル:

class Photo < ActiveRecord::Base

  belongs_to :photo_album

    attr_accessible :photo_album_id, :photo_title, :image, :remote_image_url
    mount_uploader :image, ImageUploader

end

最後に、マイクロポスト フォームは次のとおりです。

= form_for @micropost, :remote => true do |f|
    = f.fields_for @photo do |p|
        = p.file_field :image
    = f.hidden_field :user_id
    = f.text_area :content
    = f.submit "Post"

最初にエラーが発生しました:

ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes: photo):

属性が自動的に割り当てられると思っていたので、少し戸惑いました。とにかく、少なくともそれは私がドキュメントで読んだことです。とにかく先に進み、:photo をマイクロポスト モデルの attr_accessible ホワイト リストに追加しました。

最初のエラーが発生した後、次のエラーが発生しました。

ActiveRecord::AssociationTypeMismatch (Photo(#2169424320) expected, got ActiveSupport::HashWithIndifferentAccess(#2157396720)):

この機能の仕組みを誤解しているかもしれませんが、これを読み 3.2.3 api doc も確認しましたが、どこが間違っているのかはわかりません。

これを機能させるための助けをいただければ幸いです。

事前に感謝します。長い投稿がうまくいかなかったといいのですが。このすべての情報を提供することで、私が何をより良くしようとしているのかを人々に理解してもらえると思いました.

敬具

更新: 写真の代わりに :photo_attributes を使用すると、次のエラーが発生します。

Started POST "/microposts" for 127.0.0.1 at 2012-05-10 21:01:11 +0100
[02b23327ad83000f75c418d8739e7f49] [127.0.0.1] Processing by MicropostsController#create as JS
[02b23327ad83000f75c418d8739e7f49] [127.0.0.1]   Parameters: {"micropost"=>{"photo"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x00000102c293d8 @original_filename="7seriesbmw.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"micropost[photo][image]\"; filename=\"7seriesbmw.jpeg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:/var/folders/fh/fhADKPjGG8qSuCeoHCTNYE+++TI/-Tmp-/RackMultipart20120510-14787-1e1mrhh>>}, "user_id"=>"2", "content"=>"ioo"}, "commit"=>"Post", "utf8"=>"✓", "authenticity_token"=>"/y8Lr+e7xgabt60GWxnMGvCtIi7IjqrYDoA84vAqYcE=", "remotipart_submitted"=>"true", "X-Requested-With"=>"IFrame", "X-Http-Accept"=>"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01"}
[02b23327ad83000f75c418d8739e7f49] [127.0.0.1]   User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
[02b23327ad83000f75c418d8739e7f49] [127.0.0.1] Completed 500 Internal Server Error in 649ms
[02b23327ad83000f75c418d8739e7f49] [127.0.0.1] 
ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes: photo):
  app/controllers/microposts_controller.rb:9:in `create'

attr_accessor を :photo_attributes ではなく :photo に戻した後:

Started POST "/microposts" for 127.0.0.1 at 2012-05-10 21:20:07 +0100
[985e0f204bf7ffac1f7c02fbec35ad9b] [127.0.0.1] Processing by MicropostsController#create as JS
[985e0f204bf7ffac1f7c02fbec35ad9b] [127.0.0.1]   Parameters: {"micropost"=>{"photo"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x00000102f8a3b0 @original_filename="7seriesbmw.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"micropost[photo][image]\"; filename=\"7seriesbmw.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/fh/fhADKPjGG8qSuCeoHCTNYE+++TI/-Tmp-/RackMultipart20120510-15197-9rt2xn>>}, "user_id"=>"2", "content"=>"pp"}, "commit"=>"Post", "utf8"=>"✓", "authenticity_token"=>"/y8Lr+e7xgabt60GWxnMGvCtIi7IjqrYDoA84vAqYcE=", "remotipart_submitted"=>"true", "X-Requested-With"=>"IFrame", "X-Http-Accept"=>"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01"}
[985e0f204bf7ffac1f7c02fbec35ad9b] [127.0.0.1]   User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
[985e0f204bf7ffac1f7c02fbec35ad9b] [127.0.0.1] Completed 500 Internal Server Error in 452ms
[985e0f204bf7ffac1f7c02fbec35ad9b] [127.0.0.1] 
ActiveRecord::AssociationTypeMismatch (Photo(#2180069640) expected, got ActiveSupport::HashWithIndifferentAccess(#2153916820)):
  app/controllers/microposts_controller.rb:9:in `create'

マイクロポスト コントローラの作成アクション:

def create


    if params[:micropost][:user_id].to_i == current_user.id
     @micropost = current_user.microposts.build(params[:micropost])

     @comment = Comment.new(:user_id => current_user.id)
        respond_to do |format|
            if @micropost.save


            format.js   { render :post_on_springboard }

            end
        end
    else

    user = User.find_by_username(params[:micropost][:username])
    @micropost = user.microposts.build(params[:micropost])
    if @micropost.save

    UserMailer.new_wall_post_notification(user, current_user).deliver if user.email_notification == 1

    flash[:success] = "Micropost posted"
    redirect_to root_path+user.username
    else
    flash[:error] = "#{@micropost.errors.full_messages.first}"
    redirect_to root_path+user.username
    end

    end

end
4

4 に答える 4

1

あなたがやろうとしていることの多くは人間関係に関するものであり、Rails の規則をうまく機能させることができるはずです。Rails を使用して非常に単純なコードを大量に書き始めた場合、通常は悪い兆候です。

私は実際にあなたのルートに最初に焦点を当てます.

たとえば、アルバム内に写真をネストする場合、たとえば

resources :albums do
  resources :photos
end

次に、必要なパスと機能の多くを取得します。

あなたのフォームform_for [@album, @post]があなたに合うようなものを使用していることを確認してくださいaccepts_nested_attributes_for

于 2012-05-10T22:54:23.577 に答える
0

:photo_attributes をマイクロポスト モデルの attar_accessible リストに追加してみてください

これで最初のエラーは解決するはずです。

まだ2番目を探しています。

フォームから完全なスタック トレースを投稿できますか。コントローラーのメソッドに問題がある可能性があります。

于 2012-05-10T19:41:57.900 に答える
0

変化

f.fields_for @photo 

f.fields_for :photo 

と追加

@micropost.build_photo(:photo_album_id => :photo_album_id => current_user.photo_albums.find_by_album_title("microposts album").id) 

私のmicroposts_controllerに私の問題を修正しました

于 2012-05-11T13:18:25.730 に答える