2009-05-24 3 views
0

我々は...なぜ私たちはform_for @story do | f |を使うのですか?ループがないときは?値がブロック内のiを "歩留まり" となるように、

(1..10).each do |i| 
    p i 
end 

を使用していますが、どのような

<% form_for @story do |f| %> 
    <%= f.text_field :name %> 
<% end %> 

について全くループがありません...なぜそれがループのように見えるようにする必要がありますか?私たちはループのように見えることなくそれをすることはできませんか? (別の方法で書いてください)?

また、ここでStoryインスタンスを使用する必要がありますか?ストーリーを使って同じ結果を得ることはできませんか? @storyインスタンスは新しく作成され、データはまったくありません。実際にフォームを作成するのに役立ちますか?できない:物語はすでに十分ですか?ありがとう。

アップデート:私は、それが自動的に開始と終了を追加するためのブロック方法がbegin_formとEND_FORMを保存すると思います(ただ擬似コード)

with_model_give_form (@story) do |f| 
    f.begin_form 
    f.text_field :name 
    f.end_form 
end 

はと同様のアイデアですブロックを呼び出す前後。それが主な利点ですか?

答えて

6

この場合、Rubyの仕組みを誤解していると思います。

すべてをブロックに入れても、ループとは関係ありません。

あなたが実際に

(1..10).each do |i| 
    p i 
end 

に何がブロック{|i| p(i); }を作成し、機能Range.each()

それはform_forと同じものであるに送信されます。実際にはブロック{|f| puts(f.text_field(:name)); }を作成し、それをform_for関数に渡します。 (今はputsは使用しませんが、いくつかの文字列連結は考えられます)。

これは基本的にはループではありませんが、ループで呼び出されると何度か呼び出されるラムダ関数です。

Here is some more information about blocks

更新:あなたの更新について 。ある意味では、それは主な利点です。それは完全には真実ではありませんが、あなたはそのアイディアを得ています。そのブロック(と他の多く)の目的は、コードを読みやすく理解することです。また、開発をスピードアップする。

ブロックにコードを分割することは常に求められています。機能、クラス、およびその他のステートメントの概念を見てください。

例えば、form_forは、開発のスピードアップを主な目的としています。はい、開始タグと終了タグが作成されますが、すべてではありません。

<% form_for @story do |f| %> 
    <%= f.text_field :name -%> 
<% end %> 

が実際に何か書くことができます:それはまさにそのようなことはないだろう、当然の

<form action="<%= polymorphic_edit_path(@story) -%>" 
     id="<%= @story.class_name.underscore -%>"> 
    <%= text_field :story, :name -%> 
</form> 

を、これは単純化がたくさんあるとform_for機能はそれよりもはるかに多くを行うことができ、しかし、少なくともあなたは写真を撮るべきです。

+0

私は質問に何かを加えました...それは更新部分のようなものですか? –

0

"yield"は必ずしもループを意味するとは限りません。これは "ブロック"コンセプトのほうが多く、反復/ループのコンテキストのほうがより顕著に現れます。歩留まりがループ構造であると考えるほど、あなた自身が穴をあけ、ブロックのawesomenessを真に学ぶことから身を守ることができます。

として:物語、ええ、それは色あせています。あなたはRailsがただそれを一定化し、そこからそのモデルを推論すると思うでしょう。また、あなたのビューでStory.newを使うこともできますが、コントローラでそれを行うこともできますが、同じことです。

+0

私のアップデートのようなものですか? –

関連する問題