ruby-on-rails - validates_associated 验证两个模型之间的关联

标签 ruby-on-rails ruby ruby-on-rails-4

我有两个模型 Post 模型和 Comment 模型。首先,如果创建一个帖子,它的帖子 ID 为 1,然后在创建评论时,我可以使用等于 1 的 post_id 与帖子关联,但是如果我创建一个帖子 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 在创建评论之前检查 post 模型中的验证是否通过。如果我错了,请澄清一下,对于上述情况,什么是合适的解决方案?

最佳答案

首先,在这里设置关联 b/w Post-Comment 的首选方式是:

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

validate :post_presence, on: :create
def post_presence
  errors.add(:post_id, "Post doesn't exist") unless Post.find(post_id).present?
end

您甚至可以在 Controller 端使用 before_action/before_filter 做同样的事情钩子(Hook)。

关于ruby-on-rails - validates_associated 验证两个模型之间的关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23424753/

相关文章:

ruby-on-rails - 如何使用 Yard for Rails View 生成文档?

ruby-on-rails - Rails 4 - 验证数组中的元素

Ruby 相当于 PHP 的 $_GET

ruby-on-rails - Ruby on Rails : Seeding data for a user upon signup?

ruby - 从另一个类和 ActiveRecord::Base 继承

ruby-on-rails - 如何在 Rails 4 中将关系作为子查询传递?

ruby-on-rails - 嵌入文档的嵌套表单

ruby-on-rails - 使用 Rails 进行 Paypal 自适应(链式)支付

ruby-on-rails - 如何在 Ruby 中实现进度条?

ruby-on-rails - 如何为部署设置服务器并使用 Capistrano 进行冷部署?