在 Rails 上迭代 Ruby 中的视图
Iterating over views in Ruby on Rails
我是 Ruby Rails 菜鸟。我在 Rails 上 Ruby 上完成了 Michael Hartl 的 tutorial。到目前为止,我正在学习有关静态页面的第 3 章。到目前为止,我有 StaticPage
个具有三个视图的控制器:home
、help
和 about
。控制器的布局如下:
<!DOCTYPE html>
<html>
<head>
<title><%= yield(:title) %> | Sample App</title>
<%= csrf_meta_tags %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
<%= yield %>
</body>
</html>
我现在要做的是添加菜单栏,即所有静态页面的链接列表。到目前为止,我在 <body>
标签上有这样的东西:
<ul>
<% '???'.each do |page| %>
<li>Page!</li>
<% end %>
</ul>
我不知道该放什么而不是 '???'
- 我需要一个控制器所有视图的迭代器。提前致谢。
您所要求的不仅仅是添加静态页面。您将需要一个支持 model
的数据库来存储动态创建的页面和一个 controller
来处理 model
操作,这使您能够生成 collections
.
有了collections
你就可以得到类似
的东西
<ul>
<% '???'.each do |page| %>
<li><%= page %></li>
<% end %>
</ul>
由于您正在使用该教程,因此渲染菜单栏所需的是这个
<ul>
<li><%= link_to "Home", home_path %></li>
<li><%= link_to "Help", help_path %></li>
<li><%= link_to "About", about_path %></li>
</ul>
您可以在控制器中呈现数据库中的内容并在视图中使用它。就像在控制器中一样,我可以在一个名为 one
的方法中编写 @ones = Something.all
并且如果我在控制器中有一个 show 方法根据它所采用的参数显示数据库中的一条记录,那么我可以添加a link 如下所示,它将带我到 something_show_path/:something_id
.
<% @ones.each do |one|%>
<%= link_to "#{one}", something_show_path(@one) %>
<% end %>
但在这种情况下,数据库中没有记录您的静态页面。因此,如果您想要在视图中使用类似的语法,请将它们添加到控制器中的数组中,例如
def whatever
```rest of the code````
@pages = ["home", "about", "help"]
end
并且在视图中,您可以写
<ul>
<% @pages.each do |p| %>
<li><%= link_to("#{p}", :controller => 'static_page', :action => "#{p}") %></li>
<% end %>
</ul>
编辑评论中的问题
class StaticPagesController < ApplicationController
before_filter :load_pages, :only => [:about, :home, :help]
``` All your controller codes ```
private
def load_pages
@pages = ["load", "about", "help"]
end
end
这样 :only
列表中的所有方法都将在呈现页面之前加载 @pages。您不必在每个方法中加载它。你可以在 ApplicationController
中声明这个方法,就像我在这里做的那样,在它之前写一个私有的,然后在任何带有 before_filter
的控制器中调用它。
我是 Ruby Rails 菜鸟。我在 Rails 上 Ruby 上完成了 Michael Hartl 的 tutorial。到目前为止,我正在学习有关静态页面的第 3 章。到目前为止,我有 StaticPage
个具有三个视图的控制器:home
、help
和 about
。控制器的布局如下:
<!DOCTYPE html>
<html>
<head>
<title><%= yield(:title) %> | Sample App</title>
<%= csrf_meta_tags %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
<%= yield %>
</body>
</html>
我现在要做的是添加菜单栏,即所有静态页面的链接列表。到目前为止,我在 <body>
标签上有这样的东西:
<ul>
<% '???'.each do |page| %>
<li>Page!</li>
<% end %>
</ul>
我不知道该放什么而不是 '???'
- 我需要一个控制器所有视图的迭代器。提前致谢。
您所要求的不仅仅是添加静态页面。您将需要一个支持 model
的数据库来存储动态创建的页面和一个 controller
来处理 model
操作,这使您能够生成 collections
.
有了collections
你就可以得到类似
<ul>
<% '???'.each do |page| %>
<li><%= page %></li>
<% end %>
</ul>
由于您正在使用该教程,因此渲染菜单栏所需的是这个
<ul>
<li><%= link_to "Home", home_path %></li>
<li><%= link_to "Help", help_path %></li>
<li><%= link_to "About", about_path %></li>
</ul>
您可以在控制器中呈现数据库中的内容并在视图中使用它。就像在控制器中一样,我可以在一个名为 one
的方法中编写 @ones = Something.all
并且如果我在控制器中有一个 show 方法根据它所采用的参数显示数据库中的一条记录,那么我可以添加a link 如下所示,它将带我到 something_show_path/:something_id
.
<% @ones.each do |one|%>
<%= link_to "#{one}", something_show_path(@one) %>
<% end %>
但在这种情况下,数据库中没有记录您的静态页面。因此,如果您想要在视图中使用类似的语法,请将它们添加到控制器中的数组中,例如
def whatever
```rest of the code````
@pages = ["home", "about", "help"]
end
并且在视图中,您可以写
<ul>
<% @pages.each do |p| %>
<li><%= link_to("#{p}", :controller => 'static_page', :action => "#{p}") %></li>
<% end %>
</ul>
编辑评论中的问题
class StaticPagesController < ApplicationController
before_filter :load_pages, :only => [:about, :home, :help]
``` All your controller codes ```
private
def load_pages
@pages = ["load", "about", "help"]
end
end
这样 :only
列表中的所有方法都将在呈现页面之前加载 @pages。您不必在每个方法中加载它。你可以在 ApplicationController
中声明这个方法,就像我在这里做的那样,在它之前写一个私有的,然后在任何带有 before_filter
的控制器中调用它。