【问题标题】:Iterating over views in Ruby on Rails在 Ruby on Rails 中迭代视图
【发布时间】:2016-07-11 15:56:58
【问题描述】:

我是 Ruby on Rails 菜鸟。我在 Ruby on Rails 上通过 Michael Hartl 的 tutorial 工作。到目前为止,我正在阅读关于静态页面的第 3 章。到目前为止,我的StaticPage 控制器具有三个视图:homehelpabout。控制器的布局如下:

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

我现在要做的是添加菜单栏,即所有静态页面的链接列表。到目前为止,我在&lt;body&gt; 标记处有这样的东西:

<ul>
  <% '???'.each do |page| %>
    <li>Page!</li>
  <% end %>
</ul>

我不知道该放什么来代替'???' - 我需要一个控制器所有视图的迭代器。提前致谢。

【问题讨论】:

    标签: ruby-on-rails ruby railstutorial.org


    【解决方案1】:

    您所要求的不仅仅是添加静态页面。您将需要一个支持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>
    

    【讨论】:

    • 哇,这比我想象的要难!感谢您的回答,但您能否解释如何在 Embedded Ruby (&lt;%= page %&gt; -&gt; &lt;%= page.title (???) %&gt;) 中打印页面标题(我的意思是我们控制器的每个视图中的符号 :title)并更详细地解释数据库部分(或告诉我它将在教程中的位置)
    • 一点一点地消化教程,你会到达列出所有这些的部分
    【解决方案2】:

    您可以在控制器中渲染数据库中的某些内容并在视图中使用它。就像在控制器中一样,我可以在一个名为 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 的控制器中调用它。

    【讨论】:

    • 你能告诉我如何将@pa​​ges 添加到控制器吗?我试图将声明放在ApplicationController.initialize 中,但视图中的代码什么也没提供。 (没有错误,但也没有列表项)
    • 有几种方法可以做到这一点。最简单但不太好的方法是在您尝试使用时设置一个全局变量。不要在变量前使用@ 符号。添加$ 符号。而且您不需要将它包含在初始化方法中。把它写在所有方法之外。
    • $post = ["about", "help"] 或者您可以在调用每个方法之前在控制器本身中定义一个私有方法来调用。像before_filter :load_pages, :only =&gt; [:about, :home, :help] 一样,在该函数中添加变量@pages。我会在答案中更新。
    猜你喜欢
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多