【问题标题】:Assign a rendered partial to an instance variable将渲染的部分分配给实例变量
【发布时间】:2014-05-13 08:42:31
【问题描述】:

在 rails 4 中,我想在页面的任何位置呈现部分内容(比如页脚)。

在 home_controller.rb 中,我在一个类中有这个:

def spree_application
 @test = render :partial => 'spree/shared/footer'
end

当我转到索引页面并添加时:

<%= @test %>

什么都没有发生。我知道我可以在索引页面中呈现,但我问是否有办法将呈现的链接分配给变量。

谢谢!

编辑:我在这个问题上犯了一个错误。我已经定义了:spree_application

【问题讨论】:

  • 根据链接,您的模板文件中应该有下划线,如_footer.html.erb,请参阅api.rubyonrails.org/classes/ActionView/PartialRenderer.html
  • @SajanChandran - 如果指定了 key :partial,渲染会自动添加它。
  • 你能说出你在这里想要达到什么目的吗?我不认为这是将部分结果存储到控制器中的实例变量中的最佳做法,这绝对是视图的关注点。
  • 主要原因是,如果我在 application.html.erb 中添加图片链接,它会显示在所有页面上,我不希望这样。我只需要它显示在索引页面上,而不需要在 index.html.erb 文件中添加和编码。
  • “实例”变量,而不是“即时”变量

标签: ruby variables ruby-on-rails-4 spree


【解决方案1】:

你正在寻找render_to_string

【讨论】:

    【解决方案2】:

    控制器的render 方法与视图的不同。您想在视图上下文中执行它:

     @test = view_context.render 'spree/shared/footer'
    

    此方法与render_to_string 的主要区别在于它返回html_safe 字符串,因此您的 中的html 标记不会被转义。

    更新:

    但是,这不是处理您的问题的正确方法。您正在寻找“content_for”。此方法允许您构建视图的一部分,可以在布局中使用。您需要做的就是修改布局:

    # Your application layout
    <html>
      <head>
      ...
      </head>
      <body>
        yield :image
        <div id="wrapper">
          yield
        </div>
      </body>
    </html>
    

    然后在您的视图中,您可以指定要显示为yield :image 的内容

    <% content_for :image do %>
      <%# Everything here will be displayed outside of the wraper %>
    <% end %> 
    

    【讨论】:

    • 这在我添加 时不起作用。我做错了什么?
    • @user3581788 - 你是在 spree_application.html.erb 还是在布局中调用它?它在布局中不起作用。
    • 是的,我在 spree_application.html.erb 中调用它。我会尝试你所说的并报告回来。谢谢!
    • +1。这个答案的第一部分(直接回答 OP 的问题)在您有一些计算成本很高但需要在同一页面上多次呈现的内容的情况下非常有用。您可以将其呈现为 HTML 字符串一次,然后在页面上需要它的每个位置输出该字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多