Rails 5 ActionView :: Helpers捕获方法

时间:2017-11-16 10:37:16

标签: ruby-on-rails

我是铁轨上的红宝石新手,我想练习它。 当我想将视图包含在另一个视图中时,我陷入了困境。 我希望通过这样做将我的帖子放到另一个视图而不是帖子/索引

posts/index

  • 方法:

    def index
        @Posts = Post.all
    end
    
  • 视图:

    <% @posts = capture do %>
    
       <% @posts.each do |post| %>
         <h3>
          <%= post.title %>
         </h3>
        <p>
         <%= post.content %>
        </p>
      <% end %>
    
    <% end %>
    

pages/index

<h1> Index Of another pages </h1>
<%= @posts %>

2 个答案:

答案 0 :(得分:0)

听起来我觉得你需要将可重复使用的视图代码保存为部分代码,然后将其渲染到所需的所有位置。

要使用部分内容,请使用下划线前缀保存,即_posts.html.erb

然后可以使用以下方式呈现:

<%= render 'path/to/posts' %>

您可能需要将posts变量传递给partial,如下所示:

<%= render 'path/to/posts', posts: @posts %>

并将您的观点更改为使用posts而不是@posts

更新

capture的结果已分配给@posts,但此变量仍然无法在其他模板中使用 - 而是在同一页面上再次使用

根据您对项目结构的看法,听起来您需要以下内容:

在app / views / posts / _posts.html.web

<% @posts.each do |post| %>
  <h3>
    <%= post.title %>
  </h3>
  <p>
    <%= post.content %>
  </p>
<% end %>

在两个控制器'index操作中:

@posts = Post.all

在帖子/索引视图中:

<%= render 'posts' %>

在页面/索引视图中:

<%= render 'posts/posts' %>

我不想混淆事情,但Rails在那里有一点魔力 -  或者 - 您可以按如下方式定义部分_post.html.erb

<h3>
  <%= post.title %>
</h3>
<p>
  <%= post.content %>
</p>

只需在每个视图中调用<%= render @posts %>即可。这将是最好的'Railsy'做事方式。

让我知道你是怎么过的!

答案 1 :(得分:0)

如果要强制索引操作呈现另一个视图,请使用以下代码:

def index
  @Posts = Post.all
  render 'pages/index'
end

如果我没有找到你,请纠正我