我有两个模型Post模型和Comment模型..首先如果创建一个帖子它的帖子ID为1然后在创建评论时我可以使用post_id等于1给帖子关联但是如果我创建一个帖子ID为2的评论不存在它仍会继续创建评论,但ID为' nil' ..我想确保评论将被创建只有相应的post_id存在。
class Post < ActiveRecord::Base
has_many :comments, dependent: destroy
end
class Comment < ActiveRecord::Base
belongs_to :post
validates_associated: post
end
根据我的理解,validates_associated会在创建评论之前检查帖子模型中的验证是否通过。如果我错了,请澄清我,对于上述情况,什么是合适的解决方案?
答案 0 :(得分:1)
首先,在这里设置关联的首选方式是发表评论:
def new
@product = Product.first
@comment = @product.comments.build
end
def create
@product = Product.find(params[:comment][:post_id])
@comment = @product.comments.create(comment_params)
end
对于您的特定情况,我假设post_id
通过某种形式或类似物进入参数,然后您希望仅在具有该特定post_id
的帖子时创建评论存在。这可以通过在Comment
模型中添加以下内容来完成:
validates :post, presence: true, allow_blank: false
OR
validate :post_presence, on: :create
def post_presence
errors.add(:post_id, "Post doesn't exist") unless Post.find(post_id).present?
end
你甚至可以在控制器端使用before_action
/before_filter
挂钩做同样的事情。
答案 1 :(得分:0)
您可以执行此操作来验证post_id
class Comment < ActiveRecord::Base
belongs_to :post
validates :post_id, :presence => true
end
或要验证关联,您可以使用
class Comment < ActiveRecord::Base
belongs_to :post
validates_presence_of :post
end