1

私は次のような2つのモデルを持っています


    Class Post  
      has_many :comments, :dependent => :destroy 
    end  

    Class Comment  
      validates_presence_of :post
      validates_presence_of :comment
      belongs_to :post  
    end  
  

コメントコントローラでは、


    def create
      comment = @post.comments.build(params[:comment])
      if comment.save
        // some code
      else
        // some code
      end
    end

検証によりコメントが無効な場合、コメントは保存されません。ただし、ビューで@postオブジェクトにアクセスすると、nilidのコメントオブジェクトが含まれます。これは、Rails2.3.11では発生しませんでした。Rails 3.1にアップグレードされ、次にRails3.2にアップグレードされます。@ post.reloadを実行すると、idがnilのこのコメントオブジェクトは表示されなくなります。REEを使用しています。

ビルドと新しいメソッドを交換しようとしました。ビルドと同じ結果になりました。同様の動作がアプリケーション全体で見られます。それは予想される動作ですか、それとも私は何か間違ったことをしていますか?

4

2 に答える 2

2

これは私には予想される動作のようです。

http://guides.rubyonrails.org/association_basics.html#belongs_to-association-reference経由

4.1.1.3 build_association(attributes = {})

build_associationメソッドは、関連付けられたタイプの新しいオブジェクトを返します。このオブジェクトは渡された属性からインスタンス化され、 このオブジェクトの外部キーを介したリンクが設定されますが、関連付けられたオブジェクトはまだ保存されていません。

あなたが電話するとき@post.comments.build(...)、Rails:

  1. 新しいCommentオブジェクトを作成します
  2. に設定comment.post_id@post.idます。
  3. commentsそれを(メモリ内の)配列に挿入します。

検証が失敗した場合、コメントは削除されず、コメントはメモリ内のコメント配列に保持されます。@postあなたの意見に到達したとき、@post.commentsまだそのひどく検証されたコメントを含みます。

どう対処したらいいのかわかりません。たぶんあなたは(あなたのコントローラーで)のようなことをすることができます...(しかしかなり醜い感じがします。)

def create
  comment = @post.comments.build(params[:comment])
  if comment.save
    // some code
  else
    @bad_comment = @post.comments.pop
  end
end
于 2013-02-06T05:15:20.577 に答える
0

レール3.2を使用しているときに同様の問題が発生しました

まず、コントローラーで2つの別々のメソッドを作成する必要があります。それらは次のようになります。

  1. 'build_association'を使用してコメントを作成するために使用される'new'メソッド

    def new
        @post = Post.new
        comment = @post.build_comments
    end
    
  2. 'create_association'を使用して実際にコメントを作成する'create'メソッド

    def create 
        @post = Post.new(params[:post])
        comment = @post.create_comments(params[:post][:comment_attributes])
    
        if comment.save
            // some code
        else
            @bad_comment = @post.comments.pop
        end
    end
    

注:「fields_for」を使用して、「comment」属性を「post」のネストされた属性としてフォームに渡すことをお勧めします。

参照してください:http: //apidock.com/rails/ActionView/Helpers/FormHelper/fields_for

http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

于 2017-02-14T09:53:32.910 に答える