26961


Railsで知恵袋のようなBA機能を実装しようと奮闘していますが、アソシエーションに対しての理解ができておらずに、はまっています。

やりたいこととしては、投稿されたnoteに対して、note.idを取得する。  
また、そのnoteに紐づいたコメントのcomment.idを取得する。  
取得した情報をBestAnswerモデルに格納する。  
現状の構成とエラーが以下になります。

\------------モデル-----------------------

[code]

    class BestAnswer
      belongs_to :note
      has_one :comment
    end
    
    class Note
      has_one :best_answer
    end
    
    class Comment
      belongs_to :best_answer
    end
    
[/code]

\------------コントローラー-----------------------

[code]

    class BestAnswersController < ApplicationController
      def best
        note = Note.find(params[:note_id])
        bestanswer = note.best_answer.build(comment: params[:comment])
        bestanswer.save
        redirect_to (:back), notice: 'hogehoge'
      end
    end
    
[/code]

\------------ビュー-----------------------

[code]

    <% @note.comments.each do |comment| %>
      <%= "#{comment.user.name}さんが、#{comment.body}と言っています %>
      <%= link_to "BAに決定", best_path(:comment => comment.id, :note_id => @note.id), method: :post %>
    <% end %>
    
[/code]

\------------エラー------------------------

[code]

    Processing by BestAnswersController#best as HTML
    Parameters
    {"authenticity_token"=>"DtGJ+4qzzG2PqEJpa7GH9Fb8pQhGDX0cg+w+qhf0tP/9HIIVYabiJeW0rEiL7iydpa5PpjrdR1V1LeGzfOeJjw==", "comment"=>"43", "note_id"=>"36"}
    Note Load (0.2ms)  SELECT  "notes".* FROM "notes" WHERE "notes"."id" = ? LIMIT 1  [["id", 36]]
    Comment Load (0.3ms)  SELECT  "comments".* FROM "comments" WHERE "comments"."id" = ? LIMIT 1  [["id", 43]]
    Completed 500 Internal Server Error in 34ms (ActiveRecord: 1.1ms)
    
    ActiveRecord::AssociationTypeMismatch (Comment(#70182053951140) expected, got Fixnum(#15377440)):
    app/controllers/best_answers_controller.rb:5:in `best'
    
[/code]

ここで、エラーがでるのですが、どうすればいいでしょうか？

よろしくお願いします。


CC BY-SA 3.0
2016-06-22T14:51:55.397
26959
2016-06-22T23:46:11.023
2016-06-22T23:46:11.023
5793
15690
question
ruby-on-rails
Ruby On Railsで質問に対してのBA機能


> ActiveRecord::AssociationTypeMismatch (Comment(#70182053951140) expected,
> got Fixnum(#15377440))

のエラーを読み解くと良いと思います。

Comment オブジェクトを期待しているのに、Fixnum(数字)が渡されたよ、と言っています。  
意味は分かるでしょうか？

> note.best_answer.build(comment: params[:comment])

これは、best_answer.build の引数に、comment オブジェクトを渡すコードですね。

しかし、`params[:comment]` に入っているのは、

> best_path(:comment => comment.id, :note_id => @note.id)

ですから、comment.id が入っています。

よって、このミスマッチを解消してあげてください。

html 側で、渡すものがcomment_id であることを明示し、

> best_path(:comment_id => comment.id, :note_id => @note.id)

受け側で

> note.best_answer.build(comment_id: params[:comment_id])

または、

> comment = Comment.find(params[:comment_id])  
>  note.best_answer.build(comment: comment)

で良いと思います。

validation を掛けていないなら、下の方が、Commentオブジェクトの存在確認ができる利点があります。


CC BY-SA 3.0
2016-06-22T21:55:01.653
26961
2016-06-22T21:55:01.653
7471
26959
answer