0

我肯定会在 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“将代码指向”(请更好地表达这一点?)指向循环使用的方法所在的输入控制器。

在输入控制器内部确实有诸如“编辑”、“创建”、“显示”和“销毁”之类的方法。

但是控制器中没有“标题”或“内容”方法!他们来自哪里?

而且,老实说,我不明白

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

很好。

这是我试图理解的:

@inputs = 转到输入控制器

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

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

现在,“输入”对象确实包含诸如标题和内容之类的方法,但是这些方法是从哪里来的呢?它们实际上不在控制器内部!

无论如何,非常感谢。

4

3 回答 3

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

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

于 2013-05-14T14:34:29.873 回答
0

假设@inputs 是一个项目的集合(例如一个数组),

.each do确实迭代每个项目。

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

@items 是控制器设置的变量。如果你是空的(比如当你使用脚手架时),只要知道 ruby​​ on rails 会为你工作,就像你在控制器中一样:

def index
  @inputs = Input.all
end
于 2013-05-14T14:24:52.033 回答
0

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

#each是一个 Ruby 迭代器,它在数组上进行迭代,并在|input|此处一次通过管道传递一个元素。因此,在每次迭代中,|input|都成为@inputs数组中的下一个对象。

现在,请记住这input是一个object. Rails 中的对象有几个属性。这里titlecontent是模型属性/字段,可能/可能不包含某些值。例如User,模型可以包含 - name、等属性email_address

new, create, edit, update, index, show,destroy是控制器中的 RESTful 路由,每个都执行一个动作并且每个都有一个关联的视图。

link_to是在模板中插入链接的 ActionView 助手。
link_toShow, input将您带到show控制器的操作。
link_to 'Edit', edit_input_path(input)带您执行edit控制器的操作。
等等..这些是您的控制器的操作/方法。

希望能帮助到你。:)

于 2013-05-14T14:25:59.167 回答