2017-11-24 12 views
-2

私はコメントと返信scaffoldsを持っています。Railsカスタムフォーラムを構築する

テーブル「コメント」は、フォーラムの「投稿」テーブルの役割を果たします。それをリファクタリングするのは難しいので、私はこの名前を残しました。これは私が返事を作成する方法です

schema.rb

create_table "comments", force: :cascade do |t| 
t.text "content" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.boolean "anonymous" 
t.integer "user_id" 
t.string "title" 
end 

create_table "replies", force: :cascade do |t| 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.boolean "anonymous" 
t.text "text" 
t.integer "user_id" 
t.integer "post_id" 
t.string "title" 
end 

モデル

class Comment < ApplicationRecord 
    belongs_to :user, optional: true 
    validates_presence_of :content, :title 
    has_many :replies, :dependent => :destroy 
end 


class Reply < ApplicationRecord 
    belongs_to :comment, optional: true 
    validates_presence_of :text, :title 
end 

def create 
    #@comment = Comment.find(:post_id) 
    #@reply = @comment.replies.create(:user_id, :anonymous, :text, :post_id, :title).permit(:reply) 

    @reply = Reply.new(reply_params) 
    @reply.user_id = current_user.id 

    respond_to do |format| 
    if @reply.save 
     format.html { redirect_to @reply, notice: 'Reply was successfully created.' } 
     format.json { render :show, status: :created, location: @reply } 
    else 
     format.html { render :new } 
     format.json { render json: @reply.errors, status: :unprocessable_entity } 
    end 
    end 
end 

あなたはおそらく、データベースの関係が正しく接続されていないことがわかります。

投稿とその返信を表示するには、フォーラム内のすべての返信を行い、インスタンス変数post_id == current_post.idを表示する必要があります。

返信をその投稿に直接リンクする方法があると思います。あなたは私の試行を見ることができます(コメント付きの行は作成関数内にあります)が動作していないので、schema.rbから始まる変更がいくつかあると思います。リファクタリングにどのようにアプローチするかアドバイスできますか?

Couldn't find Comment with 'id'=post_id

そして、私は次の行をどうするかわからない:

#@reply = @comment.replies.create(:user_id, :anonymous, :text, :post_id, :title).permit(:reply) 

私は本当にない私は@comment = Comment.find(:post_id)のコメントを外したときに、私はエラーを取得する

  • 私のschema.rbに@ comment.repliesテーブルまたはインスタンスがあります。どうすれば達成できますか?

答えて

0

あなたの回答にcomment_id列を追加、またはモデルでforeign_keyを指定する、すなわち

class Reply < ApplicationRecord 
    belongs_to :comment, foreign_key: 'post_id' 
    ... 
end 

(返信コメントの権利を必要とするように私はoptional: true削除した?あなた」する必要があります私はそうだと思うでしょう:)

あなたはどこかに返信を添付する必要があります - フォームビューのIDを持つ非表示のフィールド(すべてのparams)、またはユーザーに返信を割り当てるのと同様の方法で入力します。@reply.comment = a_comment_instance

希望しますか?


編集:あなたが言及したエラー再、@comment = Comment.find(:post_id)は(文字通り):post_idのidのコメントを探している - あなたは@comment = Comment.find(params[:post_id])を意味するのですか?

+0

私はあなたが他の方法で物事を得ていると思います。コメントは実際には投稿またはスレッドです。そして返信はスレッド(投稿)@SRack内の実際のコメントです – Robert

+0

私は次のことを確信しています - 上記のコードを試しましたか?外部キーがモデル名に対応していない場合( 'replies'テーブルに' post_id'があります)、それを指定する必要があります。読みやすくするために上記の代入を切り替えるには、 'a_comment_instance.replies << @ reply'を実行します。 (また、あなたがこの段階で混乱している場合は、データの名前を変更する価値があると言いたいのですが、長期的にはあなたの苦痛を軽減します) – SRack

+0

私はエラーが発生しました 引数の数が間違っています(外部のキーコードと@reply = @ comment.replies.create(:user_id、:anonymous、:text、:post_id、:title).permit(:reply)与えられた5、期待される0..1) – Robert

関連する問題