如何在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的更好方法是什么?
答案 0 :(得分:1)
如果您想在撰写后设置帖子应在哪个博客上发布,您必须通过设置attr_accessible
因此,在您的示例中,Post模型应该看起来像
class Post < ActiveRecord::Base
belongs_to :blog
attr_accessible :blog_id, :title, :content
validates :blog_id, :presence => true
end
除此之外。小心如何建立你的关系。 has_one
和belongs_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属性。