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_tohas_oneは何かの 1 つがあなたのものであると言っているので、何かがあなたを指し示しています。has_onePostユーザーが…と言ってもあまり意味がありません。

投稿がブログに属するだけで十分です。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 に答える