我正在尝试生成包含一些HTML的JSON响应.因此,我有/app/views/foo/bar.json.erb
:
{ someKey: 'some value', someHTML: "<%= h render(:partial => '/foo/baz') -%>" }
我希望它渲染/app/views/foo/_baz.html.erb
,但它只会渲染/app/views/foo/_baz.json.erb
.传球:format => 'html'
没有帮助.
从Rails 3.2.3开始,当调用render时:部分使用
:formats => [:html]
代替
:format => 'html'
怎么了?
render :partial => '/foo/baz.html.erb'
?我只是尝试这个从Atom构建器模板中呈现HTML ERB部分,它工作正常.不需要弄乱全局变量(是的,我知道他们面前有"@",但这就是他们的意思).
您的with_format &block
方法很酷,并且具有仅指定格式的优点,而简单方法也指定模板引擎(ERB/builder/etc).
对于Rails 3,with_format块可以工作,但它有点不同:
def with_format(format, &block) old_formats = formats self.formats = [format] block.call self.formats = old_formats nil end
Rails 4允许您传递格式参数.所以你可以做到
render(:partial => 'form', :formats => [:html])}
请注意,您可以在Rails 3中执行类似的操作,但不会将该格式传递给任何子部分(如果表单调用其他部分).
您可以通过创建config/initializers/renderer.rb在Rails 3中获得Rails 4的能力:
class ActionView::PartialRenderer private def setup_with_formats(context, options, block) formats = Array(options[:formats]) @lookup_context.formats = formats | @lookup_context.formats setup_without_formats(context, options, block) end alias_method_chain :setup, :formats end
见http://railsguides.net/2012/08/29/rails3-does-not-render-partial-for-specific-format/
基于roninek的回应,我找到了最佳解决方案如下:
在/app/helpers/application.rb中:
def with_format(format, &block) old_format = @template_format @template_format = format result = block.call @template_format = old_format return result end
在/app/views/foo/bar.json中:
<% with_format('html') do %> <%= h render(:partial => '/foo/baz') %> <% end %>
另一种解决方案是重新定义render
接受:format
参数.
我无法render :file
与当地人一起工作,也没有一些道路上的烦恼.
在Rails 3中,View具有格式数组,这意味着您可以将其设置为查找[:mobile,:html].设置默认为寻找:移动模板,但回退到:html模板.设置它的效果将级联到内部部分.
我能找到的最好但仍然有缺陷的方法是将这条线放在每个完整移动模板的顶部(但不是部分).
<% self.formats = [:mobile, :html] %>
缺点是你必须将该行添加到多个模板.如果有人知道如何设置这个,从application_controller.rb,我很想知道它.不幸的是,将该行添加到移动布局中并不起作用,因为模板在布局之前呈现.
只是详细说明zgchurch所写的内容:
考虑例外情况
返回被调用块的结果
认为它可能有用.
def with_format(format, &block) old_formats = formats begin self.formats = [format] return block.call ensure self.formats = old_formats end end
您有两种选择:
1)使用render:file =>"foo/_baz.json.erb"
2)通过设置@template_format变量将模板格式更改为html
render :file => "foo/_baz.json.erb"
我有一个名为'api/item.rabl'的文件,我想从HTML视图中呈现它,所以我不得不使用:
render file: 'api/item', formats: [:json]
(file
因为文件名中没有下划线,formats
而不是format
(和传递和数组))