2013-09-03 9 views
23

足場を生成しました。足場テストと呼ばせてください。 足場の中で、私は_form.html.erbをアクションのためにレンダリングしています:new =>:create and:edit =>:update提出時のform_forの違いを知るにはどうすればいいですか?new:edit

Railsは時々たくさんの魔法をします。 form_forは、適切に呼び出す方法を知っている:

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


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

足場フォームを編集対 アンスキャフォールドフォーム

<% form_for @test :url => {:action => "new"}, :method => "post" do |f| %> 
     <%= f.submit %> 
<% end %> 
012:新しいと:アクションが間を押したときを提出します

編集テンプレート

<h1>Editing test</h1> 

<%= render 'form' %> 

新しいテンプレート

<h1>New test</h1> 

<%= render 'form' %> 

両方のテンプレートが同じフォームをレンダリングするが、異なるアクションを使用することができますどのようにフォーム 間theresの何の違いを見ることはできないと?

答えて

46

チェックします@test.persisted?それが永続化されている場合、それは編集フォームです。そうでなければ、それは新しい形です。

+1

'action'と' method'はInfactは 'object.persistedのオフに基づいています'チェック?https://github.com/rails/rails/blob/4-0-stable/actionpack/lib /action_view/helpers/form_helper.rb?#L441-L453だから私はなぜこの答えが落ちたのかわからない。 "それが永続化されていれば、それは編集フォームです。もしそうでなければ、それは新しいフォーム" – vee

3

@testインスタンス変数がTest.newクラスメソッドでインスタンス化されている場合、createメソッドが実行されます。 @testがデータベースに存在するTestのインスタンスである場合、updateメソッドが実行されます。すなわち

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

<%= form_for(@test) |do| %>createコントローラメソッドに送信されたブロックが得られます。

代わりに、もし:

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

<%= form_for(@test) |do| %>updateコントローラメソッドに送信されたブロックが得られます。

UPDATE

Railsはレコードが新しいものであるか否かを認識するために使用する正確な機能はpersisted?方法です。

+0

です。それでそれらはエクスカーションで動作します:正しいのでしょうか? –

+0

正確にはどういう意味ですか? – zeantsoi

+0

def newnessの場合 @ test = Test。新しい end –

5

レコードが新しいかどうかを確認します。

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

このチェックはform_forヘルパーでトリガされると便利ですか? –

関連する問題