这是一个奇怪的要求,可能需要另一种方法,但我的大脑卡住了.
我想完成这样的事情:
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)
你不能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)
我找到了一种比从控制器设置 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
| 归档时间: |
|
| 查看次数: |
8554 次 |
| 最近记录: |