构建Rails自定义论坛

时间:2017-11-24 15:24:56

标签: ruby-on-rails ruby database oop

我有一个评论和回复支架。

表"评论"扮演论坛的帖子'表。很难重构它,所以我给它留下了这个名字。

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的回复。

我认为有一种方法可以将回复直接链接到其帖子。您可以看到我的尝试(在create函数中对它进行了注释)但它不起作用,我认为从schema.rb开始可能需要修改一些内容。你能否告诉我如何进行重构。

  • 当我取消注释@comment = Comment.find(:post_id)时出现错误:
  

无法找到评论&#39; id&#39; = post_id

我不确定如何处理下一行:

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

我的schema.rb中没有@ comment.replies表或实例。我怎样才能实现它?

1 个答案:

答案 0 :(得分:0)

您需要在回复中添加comment_id列,或在模型中指定foreign_key,即

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

(我删除了optional: true因为回复需要评论吗?你已经开启了dependent: destroy所以我猜是这样:))

然后,您需要将评论附加到某处的回复 - 在表单视图中具有id的隐藏字段(确保允许所有参数),或者以与您分配的方式类似的方式回复用户:@reply.comment = a_comment_instance

希望有帮助吗?

修改:重新提到您提到的错误,@comment = Comment.find(:post_id)正在寻找ID为(字面意思):post_id的评论 - 您的意思是@comment = Comment.find(params[:post_id])吗?