2011-02-18 14 views
44

İlk raylar uygulamasında, yuvalanmış bir nesne formu oluşturmak için form_for ve fields_for kullanmayı deniyorum. Şimdiye kadar çok iyi, ancak fields_for bloğundayken alt nesneye nasıl erişileceğini anlayamıyorum. Alt nesnede bir alanı, kullanıcı talimatlarında göstermek istediğim verilerle önceden doldurdum.Raylar - form_for ve fields_for öğelerini kullanarak, alanlar_dosyaları içindeyken alt nesneye nasıl erişirsiniz?

Modelleri
Garaj:

has_many :cars, :dependent => :destroy   
accepts_nested_attributes_for :cars 

Araç:

belongs_to :garage 

Garaj Kontrolör

Gördüğünüz gibi

_form.html.erb

<%= form_for @garage do |f| %> 
    <%= f.label :title, "Garage Name" %><br /> 
    <%= f.text_field :title %> 
    <% f.fields_for :cars do |builder| %> 
    <p>Enter license for car parked in stall: <%= car.stall_number %></p> 
    <%= f.label :license, "License #:" %><br /> 
    <%= f.text_field :license %> 
    <%= end %> 
<%= end %> 

, oluşturucu bloğu için iç: arabalar, benim kullanıcı kılavuzunda, alanını göstermek istiyorum: car.stall_number (benim denetleyicisi nüfuslu) bir tamsayı ile:

<p>Enter license for car parked in stall: <%= car.stall_number%></p> 

Ben birçok farklı fikirleri denedim: @car.stall_number, object.car.stall_number vs. hiçbir sevinç. Birden fazla arama ve fields_for kaynak koduna bir göz atmak benim anlayışıma yardımcı olmamıştır. Herhangi bir rehberlik için minnettarım.

Güncelleme: açıklama için Dan'in öneri başına ben builder.stall_number denedi ama sizin için bu değişkeni doldurmadan car erişmek istediğiniz çünkü çalışmıyor çalışıyoruz bir

NoMethodError: undefined method 'stall_number' for #<ActionView::Helpers::FormBuilder:0x00000102a1baf0> 

cevap

77

Sadece bugün bununla başa çıktım. oluşturucu sizin fields_for Form oluşturucu nesne olduğu

builder.object 

:

Sen aracılığıyla fields_for nesne erişebilirler. Özel durumunuzda şunu söyleyebilirsin:

<p>Enter license for car parked in stall: <%= builder.object.stall_number%></p> 

Bu sizin için yapmalı!

+0

Bu nesnenin referansı: ilişkiler hep bozuldu @CharlieMezak –

+0

Bu benim için çalıştı! –

3

şekilde sonuçlanır veri.

Sanırım, plakaları girebileceğiniz birçok tezgah bloğuna sahip olmak istiyorsunuz. Her durak için kendi fields_for'a ihtiyacınız olacak.

<%= form_for @garage do |f| %> 
    <%= f.label :title, "Garage Name" %><br /> 
    <%= f.text_field :title %> 

    <% for i in 1..5 %> 
    <% f.fields_for @garage.cars[i] do |builder| %> 
     <p>Enter license for car parked in stall: <%= builder.stall_number%></p> 
     <%= builder.label :license, "License #:" %><br /> 
     <%= builder.text_field :license %> 
    <% end %> 
    <% end %> 
<% end %> 

Bu durumda oluşturucu, orada tanımlamak form nesnesi kullanmak gerekir fields_for içinde: Böyle bir şey önermek istiyorum. Veriler, dış forma (f) değil, araba nesnesine (oluşturucu) eşlenmiş olduğundan.

+0

Üzgünüm Dan, bundan bahsetmeliydim.stall_number" Denedim ilk şeydi, ama ne yazık ki olsun bunu kullanarak bir: NoMethodError - # için tanımsız yöntem' stall_number' anlamına gelebilir ne Herhangi düşünceler. Teşekkürler! –

+0

Kontrolörünüzde araba modelleri yaratıyorsunuz, sonra onlara referans göstermelisiniz.Ticaret ettiğim kodlara bakın.Her durak için kendi alt formunuza sahip olmanız gerekir. @ Garage.stalls, 5 tezgahın tümünü ifade eder, Bu nedenle Ruby, hangisini kullanmak istediğinizi bilmiyor. Sadece aşağıdakileri deneyebilir, kodunuzu kullanabilir ve yerine kullanabilirsiniz: @ garage.cars [1] ile arabaları değiştirebilir ve car.stall_number'ı builder.stall_number olarak değiştirebilir – Dan

İlgili konular