1

如何在 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 哈希中删除 blog_id,还是不?无论如何,在我的 Post 模型中验证 User.blogs 的 blog_id 附件的更好方法是什么?

4

2 回答 2

1

如果你想设置文章写完后在哪个博客上发布,你必须通过设置将 blog_id 放入白名单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说某样东西是你的,所以某样东西指向你。说 Post 用户没有多大意义has_one......

一个帖子只属于一个博客就足够了。你仍然可以current_user.posts像你已经做的那样通过如何在用户模型中设置关系来做一些事情......

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

于 2012-04-23T01:35:35.667 回答
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 属性可访问。

于 2013-08-22T06:00:42.690 回答