[英]Iterating over views in Ruby on Rails
我是Ruby on Rails菜鸟。 我研究了Michael Hartl的Ruby on Rails 教程 。 到目前为止,我在关于静态页面的第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方法,该方法根据所使用的参数显示数据库中的一条记录,则可以添加一个链接,如下所示:在下面,它将带我到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
对其进行调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.