在控制器中使用content_for

Iva*_*van 6 ruby-on-rails-3

这是一个奇怪的要求,可能需要另一种方法,但我的大脑卡住了.

我想完成这样的事情:

class UsersController < ApplicationController
  before_filter Proc.new { share_params :user_name }, :only => :show
  render_djs
end

class ApplicationController < ActionController::Base
  include ActionView::Helpers::CaptureHelper
  def share_params(*shared)
    content_for(:djs) { shared.inspect }
  end

  def self.render_djs
    before_filter Proc.new {
      render :inline => "<%= yield(:djs) %>" if request.format.djs?
    }
  end
end
Run Code Online (Sandbox Code Playgroud)

我想使用,content_for因为我可能想:djs在其他过滤器中添加内容到yield.

但是,这个代码提出了undefined method output_buffer=.

我想我可以使用一个实例变量,但这看起来更干净,不是吗?

KAR*_*ván 13

您需要使用该#view_context方法来访问视图上下文,然后您可以像在视图中那样执行相同的操作:

view_context.content_for(:something, view_context.render(partial: 'some_partial'))
Run Code Online (Sandbox Code Playgroud)

  • 由于某些原因,这在Rails 4中不起作用 (4认同)
  • ...显然在Rails 5中都没有. (3认同)

Yi *_*Xie 6

你不能content_for在控制器中使用,即使你知道view_context可以提供该方法。请参阅此处的问题:https ://github.com/rails/rails/issues/4906

该方法view_context总是返回一个新对象。当您调用时,view_context.content_for(:somethin, 'content')它将把内容存储在新对象的实例变量中。

您可以在控制器中进行如下实验:

view_context.content_for(:title, 'hello')
view_context.view_flow.content # => {}

a = view_context
a.content_for(:title, 'hello')
a.view_flow.content # =>  {:title=>"hello"}
Run Code Online (Sandbox Code Playgroud)

content_for无论如何,如果您仍然想在控制器中使用,您可以view_context在控制器中覆盖作为解决方法。但不知道有没有副作用。

def view_context
  @_view_context ||= super
end
Run Code Online (Sandbox Code Playgroud)


Jos*_*ech 0

我找到了一种比从控制器设置 content_for 更干净的方法。

就我而言,我有需要为每个视图显示的侧边栏。

在我的布局中我有

<%= yield :sidebar %>
Run Code Online (Sandbox Code Playgroud)

然后我有一个部分调用_set_sidebar.html.erb来执行此操作

<% content for :sidebar do %>
   <% render :partial => "layouts/sidebar", locals => {:locs => locs} %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

然后我只是在每个视图中放置一个衬里,我也希望有那个侧边栏

<%= render :partial => "layouts/set_sidebar", locals => {:locs => locs}
Run Code Online (Sandbox Code Playgroud)

否则我以前用过这个

当我使用 render_to_string 时https://gist.github.com/985457和 .html_safe