2012-04-22 4 views
1

Comment puis-je valider les relations dans les modèles en RoR? Par exemple, j'ai 3 modèles:Validation des modèles relationnels dans 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 

Et dans mon contrôleur:

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

Mais quand je veux créer après je reçois:

Can't mass-assign protected attributes: blog_id 

Je ne devrais pas obtenir cette erreur , parce que je supprime blog_id de hash params, ou non? Quoi qu'il en soit, quelle est la meilleure façon de valider l'accessoire blog_id sur User.blogs dans mon modèle Post?

Répondre

1

Si vous souhaitez définir le sur lequel blog le poste devrait être publié après l'écriture, vous devez mettre le blog_id dans la liste blanche en mettant attr_accessible

Donc, dans votre exemple, votre modèle Post devrait ressembler à

class Post < ActiveRecord::Base 
    belongs_to :blog 

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

En plus de cela. Faites attention à la façon dont vous définissez votre relation. La différence entre has_one et belongs_to est l'endroit où la clé étrangère va. Il va à l'endroit où vous définissez le belongs_to. has_one dit que l'un de quelque chose est à vous, alors quelque chose vous rappelle. Il n'a pas beaucoup de sens de dire qu'un poste has_one utilisateur ...

Il suffit d'avoir un article n'appartiennent qu'à un blog. Vous pouvez encore faire quelque chose comme current_user.posts par la façon dont vous configurez la relation dans le modèle de l'utilisateur comme vous l'avez déjà fait ...

Je vous recommande de lire les liens suivants http://guides.rubyonrails.org/association_basics.html http://api.rubyonrails.org/classes/ ActiveModel/MassAssignmentSecurity/ClassMethods.html

+0

Thx, mais je demande quelque chose d'autre. Par exemple, l'utilisateur n ° 1 dispose de blogs n ° 1 et n ° 2 et l'utilisateur n ° 2 de blogs n ° 3 et n ° 4. Comment puis-je valider blog_id dans le modèle Post, que pour l'utilisateur 1, il peut être seulement # 1 ou # 2 et # 3 ou # 4 pour l'utilisateur # 2? Et pourquoi j'ai une erreur si j'utilise params [: post] .delete (: blog_id)? –

0

Les validations pour: blog_id dans le modèle Post sont parfaites.

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

: blog_id est supprimé de params [: après], mais regardons la chose d'un point de vue différent.

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

params [:] poste n'a pas: blog_id, mais construire méthode attribue automatiquement blog_id à @ blog.id. C'est pourquoi l'erreur pour: blog_id ne s'affiche pas.

Si vous voulez éviter l'avertissement d'attribution de masse, vous pouvez rendre l'attribut: blog_id accessible.

Questions connexes