我们使用
(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,因为它会在调用块之前和之后自动添加开始和结束。这是主要的好处吗?
答案 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,而不是在控制器中执行此操作,但是,这是同样的事情。