В Rails почему мы используем form_for @story do | f | когда нет петли? - PullRequest
0 голосов
/ 24 мая 2009

мы используем

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

так, чтобы значение было "yield" для i в блоке ...

а как же

<% 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

поэтому я думаю, что метод блока сохранит begin_form и end_form, потому что он автоматически добавляет начало и конец до и после вызова блока. это главное преимущество?

Ответы [ 2 ]

6 голосов
/ 24 мая 2009

Я думаю, вы неправильно поняли, как работает Ruby в этом случае.

Это правда, что вы помещаете все в блок, но это не имеет ничего общего с циклом.

Что вы на самом деле делаете в

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

создает блок {|i| p(i); } и отправляет его в функцию Range.each()

То же самое с form_for. На самом деле вы создаете блок {|f| puts( f.text_field(:name)); } и передаете его в функцию form_for. (теперь он использует не путы, а конкатенацию строк, но вы поняли).

Так что это в основном не цикл, а лямбда-функция, которая будет вызываться несколько раз при вызове в цикле.

Вот еще немного информации о блоках

Обновление: По поводу вашего обновления. В некотором смысле, да, это главное преимущество. Это не совсем верно, но вы поняли идею. Цель этого блока (и многих других) состоит в том, чтобы облегчить чтение и понимание кода. А также для ускорения разработки.

Деление кода на блоки всегда искали, достаточно взглянуть на концепцию функций, классов и других операторов.

Например,

, 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 голосов
/ 24 мая 2009

«Выход» не всегда подразумевает цикл - это скорее концепция «блока», просто он проявляется в большей части контекста итерации / цикла. Чем больше ты думаешь о том, что yield является циклической конструкцией, тем больше ты дыряваешь в себе и не позволяешь себе по-настоящему изучить удивительность блоков.

Что касается: история, да, это отчасти хромой. Можно подумать, что Rails просто подтвердит это и выведет его модель оттуда. Вы могли бы также просто Story.new на ваш взгляд, вместо того, чтобы делать это на вашем контроллере, но да, это то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...