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

nop*_*ole 0 ruby-on-rails

我们用

(1..10).each do |i|
  p i
end
Run Code Online (Sandbox Code Playgroud)

所以一个值在块中"收益"到i ...

但是关于

<% form_for @story do |f| %>
  <%= f.text_field :name %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

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

with_model_give_form (@story) do |f|
  f.begin_form
  f.text_field :name
  f.end_form
end
Run Code Online (Sandbox Code Playgroud)

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

Jim*_*nke 6

我认为你误解了Ruby在这种情况下的工作方式.

确实,你把所有东西放在一个块中,但它与循环无关.

你到底做了什么

(1..10).each do |i|
  p i
end
Run Code Online (Sandbox Code Playgroud)

正在创建块{|i| p(i); }并将其发送到函数Range.each()

它是一回事form_for.你实际做的是创建块{|f| puts( f.text_field(:name)); }并将其传递给form_for函数.(现在它不使用puts,但是一些字符串连接,但你明白了).

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

这里有一些关于块的更多信息

更新: 关于您的更新.在某种程度上,是的,这是主要的好处.这不完全正确,但你明白了.该块(以及许多其他块)的目的是使代码更易于阅读和理解.并且还要加快发展.

始终寻求将代码划分为块,只需查看函数,类和其他语句的概念.

例如,form_for主要是为了加快发展.是的,它会创建开始和结束标记,但这不是全部.

<% form_for @story do |f| %>
  <%= f.text_field :name -%>
<% end %>
Run Code Online (Sandbox Code Playgroud)

实际上可以这样写:

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

当然,它不完全是这样,这是一个很简化的form_for功能,而且功能可以做很多,但至少你应该得到图片.