2010-12-14 34 views

cevap

5

form_for yardımcısında @product yardımcıları daha fazla özellik ile birlikte gelir.

:product yalnızca giriş alanının kimliğini ve adını etkiler.

<%= form_for :product, :url => {...} do |f| %> 
    <%= f.text_field :price %> 
<% end %> 

oluşturulan html gibi görünecektir::

<input type="text" id="product_price" name="product[price]" /> 

id ve name değeri :product.to_s ve metin alanı adına göre belirlenir Örneğin şeklinde açılan bir metin var.

Eğer @product kullanırsanız url @product 'ın durumuna göre belirlenecek çünkü, :url gerekli olmasa da: @product yeni bir rekor ise

  • , url create
  • yayın ediyorum
  • aksi url update

göndermek istiyorum ve dosyalanmış girişin kimliği ve adı 'ın cl @product etkilenir eşek adı, bu yüzden tek bir tablo kalıtım kullandığınızda önemlidir. Dosyalanan değerin değeri @product'un öznitelik değeri ile otomatik olarak atanır.Eğer @product kullanmak Yani eğer, html çıkış gibi görünecektir:

<input type="text" id="item_price" name="item[price]" value="some value" /> 

Ve tabii ki kullanabilirsiniz: varsayın

<input type="text" id="product_price" name="product[price]" value="some value" /> 

@product 'ın sınıf adı daha sonra çıkış için değiştirecek, Item olduğunu :product ve @product her iki:

<%= form_for :product, @product do |f| %> 

dosyalanan :product kontrolleri girişin adı ve kimliği ve @product, URL ve giriş alanının değerini kontrol eder.

+0

: ürün ayrıca form_for'un ürettiği URL'yi de etkiler. –

+0

Evet, ama asla bir: 'url' atamadan bir sembol argümanı kullanmıyorum. Aslında sembol nadiren yalnız kullanılır. – Kevin

+0

Form_for (: ürün, ...) işlevini kullandığımda '@ product' değerleri ile doldurulmuş metin alanlarını görüyorum. Ancak, seçim kutuları varsayılan değerleri alır (ilk seçenek). Neyin yanlış olabileceği hakkında bir fikrin var mı? Ayrıca bakınız: http://stackoverflow.com/questions/4436267/ruby-on-rails-why-a-select-box-does-not-show-the-current-object-value –

2

Benzer, ama aynı değil. @product öğesini kullandığınızda, model örneğinden form alanlarına değerleri otomatik olarak doldurabilme avantajına sahip olursunuz.

Örneğin, eylem eğer: Yeni sizin Kontrolör böyle @Product atayın:

@product = Product.new 

Sonra muhtemelen oluşturulan formda herhangi bir fark olmayacaktır. size bu takip Ancak,: Böyle eylem oluşturmak:

@product = Product.new(params[:product]) 
if @product.save 
    ... 
else 
    render :action => :new 
end 

Sonra @Product örneğini kaydetmek mümkün değilse, olduğu gibi o zaman aynı formu verecek: tümüne sahip yeni ama bu sefer kaydedilen değerler ile doldurulmuş alanlar. Kullanırsanız bu mümkün olmazdı: ürün

+0

Bunu araştırdınız mı? ': ürün 'benim için formu aynı rotaya taşır:'/products/new'. Düzenleme sayfasıyla aynı: '/ products/1/edit'. Sadece cevabını karıştırdım, hepsi bu. Benim araştırmamda gördüğüm şeyle çelişiyor *. –

+0

Sanırım farklı şeyler düşünebiliriz. Belirli bir rotadan bahsetmedim, sadece iki farklı senaryoyu kullanırken formdaki farklılıkları açıkladım. Yeni ve yaratılış örneği bu durumda hastalanmış olabilir, ancak sembol yerine bir örnek kullanmaktan nasıl yararlanabileceğinizi gösteren bir örnektir. – DanneManne

+0

': product' aynı zamanda benim için de '@ product' gibi metin alanlarını doldurur. –

1

Çok uzun bir form_for var. Sorunuzun kısa cevabı: @product, birçok nesneye sahip olabilecek bir kaynak için hangi işlemin gerçekleştirileceğini belirlemek için kullanışlıdır; Diğer yandan,, update ile aynı eyleme geçecektir. Bu en iyi tekil kaynaklar için kullanılır. Kaynakların büyük bir açıklaması Routing Guide'da bulunabilir. Ayrıca Getting Started kılavuzunda açıklanmıştır.

Sizin ikinci form_for sağ aşağı bu kısa olabilir:

<%= form_for @product do |f| %> 
    ... 
<% end %> 

tüm Yönlendirme açıklanmıştır ve kılavuzları Başlarken.

Ayrıca profilinizde de Melbourne'lı olduğunuzu gördüm. Ülke çapında buluşmaları listeleyen Ruby on Rails Oceania Google grubu var. Melbourne'de her ay bir tane var, siz de aynı fikirde olan insanlarla tanışmak isteyebilirsiniz.

+0

'FormBuilder' ı kontrol ettim ve' @ product' örneğinin '' product'' nesnesini sembol olarak yaptığını buldu. '@ product' kelimesinin literal ismini' myproduct' olarak değiştirirseniz, sembol alan değeri atamanın yanı sıra url üretememelidir. Bu yüzden benim fikrim, sadece alanın kimliğini ve ismini kontrol etmek için kullanılır ve ': url' seçeneğiyle birlikte kullanılmalıdır. – Kevin