2009-08-14 13 views
6

Powiedzmy, że masz tę strukturę:Korzystanie accepts_nested_attributes_for + masowej ochronę przypisania w 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 

Zauważ, że użytkownik telewizora nie jest dostępny na celu. Masz więc potrójnie zagnieżdżoną formę, która pozwala na wejście do domu, pokoju i telewizora na jednej stronie.

Oto kontrolera tworzyć metoda:

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

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

Pytanie: Jak w świecie chcesz zapełnić user_id dla każdego tv (powinno pochodzić z current_user.id)? Jaka jest dobra praktyka?

Oto haczyk 22 Widzę w tym.

  1. Populate user_ids bezpośrednio do params hash (są dość głęboko zagnieżdżone)
    • Zapisz się niepowodzeniem, ponieważ user_ids nie są masowo przypisane
  2. Populate użytkownik dla każdego telewizora jest po #save zakończone
    • Zapisz się nie uda, ponieważ user_id musi być obecny
    • Nawet jeśli pominąć powyższe, telewizory będą bez identyfikatorów chwilę czasu - ssie

każdy przyzwoity sposób to zrobić?

+2

Dzięki za twoje pytanie. Attr_accessible: rooms_attributes pomógł mi rozwiązać problem związany z masą z Rails 2.3'S accepts_nested_attributes_for feature. Wystąpił błąd o treści "OSTRZEŻENIE: nie można przypisać masowo tych chronionych atrybutów: XXX_attributes". – craig

Odpowiedz

2

Coś nie tak z tym?

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 

Nie próbowałem tego, ale wydaje się, że obiekty powinny być budowane i dostępne w tym miejscu, nawet jeśli nie zostały zapisane.

+0

Masz rację, nie wiem, gdzie była moja głowa, kiedy o to pytałem. –

+0

Zdarza się nam wszystkim. Cieszę się, że mogłem pomóc. BTW - tweetowanie adresu URL było dobrym pomysłem, muszę to zrobić sam. –