2012-04-22 8 views
1

RoRのモデルの関係を検証するにはどうすればよいですか?たとえば、私は3つのモデルがあります:RoRの関係モデルの検証

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を削除しているか、そうでないのですか?いずれにしても、投稿モデルのUser.blogsにblog_idアクセサリを検証するにはどうすればよいでしょうか?あなたはどのポストが書き込みの後に公開されなければならないブログ設定したい場合は

答えて

1

、あなたはPostモデルが

のようになりますあなたの例ではそう attr_accessible

を設定することにより、ホワイトリストにblog_idを配置する必要があります

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ユーザー...

投稿をブログに所属させるだけで十分です。あなたはまだどのようにセットアップすでに行ったように、ユーザモデルの関係...

私は次のリンクを読むことをお勧めしたいhttp://guides.rubyonrails.org/association_basics.html http://api.rubyonrails.org/classes/によってcurrent_user.postsような何かを行うことができますActiveModel/MassAssignmentSecurity/ClassMethods.html

+0

Thxしかし、私は何か他のことについて質問します。たとえば、ユーザー#1には#1と#2のブログがあり、ユーザー#2には#3と#4のブログがあります。投稿モデルでblog_idを検証するにはどうすればいいですか?ユーザー1の場合は#2または#3、または#4のみになります。なぜ私はparams [:post] .delete(:blog_id)を使用しているとエラーになるのですか? –

0

検証の対象:投稿モデルの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しかし、ビルドメソッドは自動的にblog_idを@blog.idに割り当てます。 これは、blog_idのエラーが表示されない理由です。

大量割り当て警告を回避するには、:blog_id属性にアクセスできるようにします。