2013-09-03 19 views
23

Bir iskele ürettim, ona scaffold testi diyelim. Bu iskele içinde, _form.html.erb eylemleri için oluşturulmakta olan bir _form.html.erb var: new =>: create ve: edit =>: updateform_for gönderirken farkı nasıl bilir: new: edit

Raylar bazen çok fazla sihir yapmaz ve nasıl olduğunu anlayamıyorum yeni ve: arasına göndermek basıldığında eylemi: form_for uygun çağrı bilir düzenlemek

sorularla desteklenen Formu

<%= form_for(@test) do |f| %> 


    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

vs Un-sorularla desteklenen Formu

<% form_for @test :url => {:action => "new"}, :method => "post" do |f| %> 
     <%= f.submit %> 
<% end %> 

Düzenleme şablon

<h1>Editing test</h1> 

<%= render 'form' %> 

Yeni şablon

<h1>New test</h1> 

<%= render 'form' %> 

hem şablonları aynı formu içinde oluşturulur, ancak farklı eylemler nasıl kullanabilirim formlar arasında gidecekseniz hiçbir fark görebileceğiniz gibi?

cevap

46

@test.persisted? denetler. Bu kalıcı ise bir düzenleme formudur. Eğer değilse, bu yeni bir formdur.

+1

'action' ve' method' infact object.persisted 'off dayanır' kontrol edin:? Https://github.com/rails/rails/blob/4-0-stable/actionpack/lib /action_view/helpers/form_helper.rb?#L441-L453. Bu yüzden neden bu cevabın reddedildiğini bilmiyorum. Muhtemelen "eğer ısrar ederse o zaman bir düzenleme formudur. Eğer değilse, bu yeni bir formdur" – vee

3

@test örnek değişkeni Test.new sınıf yöntemiyle başlatılırsa, create yöntemi uygulanır. @test, veritabanında bulunan bir Test örneğidir, update yöntemi yürütülür. Diğer bir deyişle,

:

# app/controllers/tests_controller.rb 
def new 
    @test = Test.new 
end 

<%= form_for(@test) |do| %>create kontrol yöntemi gönderilen bir blok üretir.

Bunun yerine, eğer:

# app/controllers/tests_controller.rb 
def edit 
    @test = Test.find(params[:id]) 
end 

<%= form_for(@test) |do| %>update kontrol yöntemi gönderilen bir blok üretir.

UPDATE:

tam işlevi raylar bir kayıt yeni olup olmadığını tanımak için kullandığı persisted? yöntemdir.

+0

bu yüzden bu ile birlikte çalışır: eylemler doğru mu? –

+0

Tam olarak ne demek istiyorsun? – zeantsoi

+0

, yeniyse, @ test = Test ise.new end –

5

Kayıt yeni olup olmadığını denetler.

@test.new_record? # if true then create action else update action 
+0

Bu yardımcı, form_for yardımcısı içinde tetiklenen bu kontrol yardımcı oldu mu? –