在Rails中为什么我们使用form_for @story do | f |什么时候没有循环?

时间:2009-05-24 09:33:52

标签: ruby-on-rails

我们使用

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

这样一个值在块中“生成”给我......

怎么样?
<% form_for @story do |f| %>
  <%= f.text_field :name %>
<% end %>

根本没有循环...为什么我们需要让它看起来像一个循环?如果不让它看起来像一个循环,我们不能这样做吗? (用另一种方式写)?

另外,必须在这里使用Story实例吗?我们不能只使用:故事并取得同样的结果吗? @story实例刚刚新创建,根本没有数据 - 它是否真的有助于创建表单?不能:故事已经足够了?感谢。

更新

的想法类似于:(只是伪代码)

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

所以我认为block方法将保存begin_form和end_form,因为它会在调用块之前和之后自动添加开始和结束。这是主要的好处吗?

2 个答案:

答案 0 :(得分: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,但是一些字符串连接,但你明白了)。

所以它基本上不是一个循环,而是一个lambda函数,在循环中调用时会多次调用。

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函数可以做很多事情,但至少你应该得到图片。

答案 1 :(得分:0)

“yield”并不总是意味着一个循环 - 它更像是一个“块”概念,它恰好在更多的迭代/循环上下文中表现出来。你越多地认为屈服是一个循环结构,你自己就越会打击自己,并阻止自己真正学习积木的真棒。

至于:故事,是的,它有点蹩脚。你会认为Rails只会对它进行实例化并从那里推断它的模型。您也可以在您的视图中使用Story.new,而不是在控制器中执行此操作,但是,这是同样的事情。