我肯定会在某个地方找到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'确实包含诸如标题和内容之类的方法,但这些方法来自哪里?它们实际上在控制器内部无处可用!
无论如何,非常感谢。
答案 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
都有名为title
和content
的属性,因为这些属性可能在您的数据库迁移中定义为Input
表的列。
答案 1 :(得分:0)
鉴于@inputs是项目的集合(例如,数组),
.each do
会对每个项目进行迭代。
|输入|说“将每个项目放在变量输入中,这样我就可以在块中使用它了...结束。
@items是控制器设置的变量。如果你是空的(比如当你使用脚手架时),只要知道轨道上的红宝石就可以为你工作,就好像你在你的控制器中一样:
def index
@inputs = Input.all
end
答案 2 :(得分:0)
@inputs
是一个实例变量,它在控制器中使用一些objects
的集合进行实例化。作为实例变量,它存在于您的关联视图中。
#each
是一个Ruby迭代器,它迭代一个数组,并在|input|
这里一次管道一个元素。因此,在每次迭代时,|input|
成为@inputs
数组中的下一个对象。
现在,请注意input
是object
。 Rails中的对象有几个属性。此处title
,content
是模型属性/字段,可能/可能不包含某些值。
例如,User
模型可以包含类似 - name
,email_address
的属性。
new
,create
,edit
,update
,index
,show
,destroy
是其中的RESTful路线控制器,每个控制器执行一个动作,每个控制器都有一个相关的视图。
link_to
是一个ActionView帮助器,用于在模板中插入链接
link_to
显示, input
会将您带到控制器的show
操作
link_to 'Edit', edit_input_path(input)
会将您带到控制器的edit
操作
等等..这些是控制器的动作/方法。
希望它有所帮助。 :)