在RoR中验证关系模型

时间:2012-04-22 23:19:20

标签: ruby-on-rails ruby-on-rails-3 validation relationship

如何在RoR中验证模型中的关系?例如,我有3个模型:

class Post < ActiveRecord::Base
  belongs_to :blog
  has_one :user, :through => :blog

  validates :blog_id, :presence => true
end

class Blog < ActiveRecord::Base
  belongs_to :user
  has_many :posts, :dependent => :destroy
end

class User < ActiveRecord::Base
  has_many :blogs
  has_many :posts, :through => :blogs
end

在我的控制器中:

@post = current_user.blogs.find(params[:post].delete(:blog_id)).posts.build(params[:post])

但是当我想创建帖子时我得到了:

Can't mass-assign protected attributes: blog_id

我不应该得到这个错误,因为我从params hash删除了blog_id,或者不是?无论如何,在Post模型中验证blog.id配件到User.blogs的更好方法是什么?

2 个答案:

答案 0 :(得分:1)

如果您想在撰写后设置帖子应在哪个博客上发布,您必须通过设置attr_accessible

将blog_id放入白名单

因此,在您的示例中,Post模型应该看起来像

class Post < ActiveRecord::Base
  belongs_to :blog

  attr_accessible :blog_id, :title, :content
  validates :blog_id, :presence => true
end​

除此之外。小心如何建立你的关系。 has_onebelongs_to之间的差异是外键所在的位置。它会转到您定义belongs_to的位置。 has_one说某事是你的,所以有些东西指向你。说帖子has_one用户......

没有多大意义

只有Post才属于Blog才足够。您仍然可以通过如何在用户模型中设置关系来完成current_user.posts之类的操作...

我建议您阅读以下链接http://guides.rubyonrails.org/association_basics.html http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html

答案 1 :(得分:0)

验证:Post模型中的blog_id是完美的。

@post = current_user.blogs.find(params[:post].delete(:blog_id)).posts.build(params[:post])

:blog_id已从params [:post]中删除,但让我们从不同的角度看待这件事。

@blog = current_user.blogs.find(params[:post].delete(:blog_id))
@post = @blog.build(params[:post])

params [:post]没有:blog_id,但build方法会自动将blog_id分配给@ blog.id。   这就是为什么错误:blog_id没有出现。

如果您想避免质量分配警告,可以访问:blog_id属性。