2009-08-14 7 views
6

Supposons que vous avez cette structure:aide accepts_nested_attributes_for + protection d'affectation de masse dans Rails

class House < ActiveRecord::Base 
    has_many :rooms 
    accepts_nested_attributes_for :rooms 
    attr_accessible :rooms_attributes 
end 

class Room < ActiveRecord::Base 
    has_one :tv 
    accepts_nested_attributes_for :tv 
    attr_accessible :tv_attributes 
end 

class Tv 
    belongs_to :user 
    attr_accessible :manufacturer 
    validates_presence_of :user 
end 

Notez que l'utilisateur de télévision ne sont pas accessibles sur le but. Donc, vous avez un formulaire imbriqué qui vous permet d'entrer dans la maison, les chambres et les téléviseurs sur une seule page.

est ici de créer du contrôleur de la méthode:

def create 
    @house = House.new(params[:house]) 

    if @house.save 
    # ... standard stuff 
    else 
    # ... standard stuff 
    end 
end 

Question: Comment dans le monde vous remplir user_id pour chaque télévision (il devrait provenir current_user.id)? Quelle est la bonne pratique?

Voici le catch22 que je vois dans ceci.

  1. Populate user_ids directement dans params hachage (ils sont assez profondément imbriquées)
    • Enregistrer échouera car user_ids ne sont pas en masse assignable
  2. utilisateur pour chaque Populate télévision après #save est terminé
    • L'enregistrement échouera car user_id doit être présent
    • Même si nous contournons ce qui précède, TVS sans ids pour un moment de temps - suce

De toute façon décente de le faire?

+2

Merci pour votre question. Le 'attr_accessible: rooms_attributes' m'a aidé à résoudre un problème de masse avec Rails 2.3'S accepts_nested_attributes_for feature. Je recevais une erreur qui indiquait 'AVERTISSEMENT: impossible d'affecter en masse ces attributs protégés: XXX_attributes'. – craig

Répondre

2

Quelque chose ne va pas avec ça?

def create 
    @house = House.new(params[:house]) 
    @house.rooms.map {|room| room.tv }.each {|tv| tv.user = current_user } 
    if @house.save 
    # ... standard stuff 
    else 
    # ... standard stuff 
    end 
end 

Je ne l'ai pas essayé, mais il semble que les objets doivent être construits et accessible à ce point, même si pas enregistré.

+0

Vous avez raison, je ne sais pas où était ma tête quand je demandais cela. –

+0

Ça nous arrive à tous. Heureux d'avoir pu aider. BTW - tweeting l'URL était une bonne idée, je vais devoir me rappeler de le faire moi-même. –