Ruby on Rails。理解循环

时间:2013-05-14 14:19:59

标签: ruby-on-rails

我肯定会在某个地方找到RoR。只是想澄清有关循环的一些事情。

我创建了一个'输入'控制器,其中包含让用户创建,读取,更新和删除数据库条目的方法。

我还有一个'输入'视图,用于呈现html前端。在视图中是以下循环:

<table>
<% @inputs.each do |input| %>
  <tr>
   <td><%= input.title %></td>
   <td><%= input.content %></td>
   <td><%= link_to 'Show', input %></td>
   <td><%= link_to 'Edit', edit_input_path(input) %></td>
   <td><%= link_to 'Destroy', input, method: :delete, data: { confirm: 'Are you sure?' } %>  
</td>
  </tr>
<% end %>
</table>

我理解循环在概念上是如何工作的,但我对此有点失落。

我认为@inputs'将代码'(更好的表达方式,请?)指向输入控制器,其中循环使用的方法是实时的。

在输入控制器内部确实存在诸如'edit','create','show'和'destroy'之类的方法。

但控制器中没有'标题'或'内容'方法!它们来自哪里?

而且,说实话,我不明白

<% @inputs.each do |input| %>

非常好。

这是我试图理解:

@inputs =转到输入控制器

.each =调用输入控制器上的每个方法。 (每个方法定义在哪里?它甚至意味着什么,在控制器上调用每个方法?)

做|输入|无论什么样的调用。控制器上的每一个,它都会生成一个名为“输入”的对象。

现在,对象'input'确实包含诸如标题和内容之类的方法,但这些方法来自哪里?它们实际上在控制器内部无处可用!

无论如何,非常感谢。

3 个答案:

答案 0 :(得分:2)

如您在上面的代码中所示,在视图模板中使用@inputs时,视图模板正在使用已在控制器操作中定义的实例变量@inputs 渲染视图模板。

换句话说,要使用示例,假设您的InputsController有一个名为index的方法。在您的视图文件夹中,您有一个名为index.html.erb的相应视图模板。

# Inside app/controllers/inputs_controller.rb
def index
  @inputs = Input.all
end

# Inside app/views/inputs/index.html.erb
<table>
<% @inputs.each do |input| %>
  <tr>
   <td><%= input.title %></td>
   <td><%= input.content %></td>
   <td><%= link_to 'Show', input %></td>
   <td><%= link_to 'Edit', edit_input_path(input) %></td>
   <td><%= link_to 'Destroy', input, method: :delete, data: { confirm: 'Are you sure?' } %>  
</td>
  </tr>
<% end %>
</table>

当调用index方法时,Rails默认会查找与被调用方法同名的视图模板;也就是说,它将搜索名为index.html.erb的视图模板。

使用我在这里给出的示例,视图模板中使用的@inputs已经从控制器调用的index动作实例化。

此外,正如您从@inputs变量的实例化中可以看到的那样:

@inputs = Input.all

@inputs是一个引用数据库中对象集合的变量。换句话说,在视图模板的循环内部,在此部分:

<% @inputs.each do |input| %>

每个|input|是对@inputs集合中包含的对象之一的引用,反过来,这些对象中的每一个对应于数据库对象(即输入模型)。这就是为什么每个input都有名为titlecontent的属性,因为这些属性可能在您的数据库迁移中定义为Input表的列。

答案 1 :(得分:0)

鉴于@inputs是项目的集合(例如,数组),

.each do会对每个项目进行迭代。

|输入|说“将每个项目放在变量输入中,这样我就可以在块中使用它了...结束。

@items是控制器设置的变量。如果你是空的(比如当你使用脚手架时),只要知道轨道上的红宝石就可以为你工作,就好像你在你的控制器中一样:

def index
  @inputs = Input.all
end

答案 2 :(得分:0)

@inputs是一个实例变量,它在控制器中使用一些objects的集合进行实例化。作为实例变量,它存在于您的关联视图中。

#each是一个Ruby迭代器,它迭代一个数组,并在|input|这里一次管道一个元素。因此,在每次迭代时,|input|成为@inputs数组中的下一个对象。

现在,请注意inputobject。 Rails中的对象有几个属性。此处titlecontent是模型属性/字段,可能/可能不包含某些值。 例如,User模型可以包含类似 - nameemail_address的属性。

newcreateeditupdateindexshowdestroy是其中的RESTful路线控制器,每个控制器执行一个动作,每个控制器都有一个相关的视图。

link_to是一个ActionView帮助器,用于在模板中插入链接 link_to显示, input会将您带到控制器的show操作 link_to 'Edit', edit_input_path(input)会将您带到控制器的edit操作 等等..这些是控制器的动作/方法。

希望它有所帮助。 :)