如何在Rails中呈现不同格式的部分内容?
我试图生成一个包含一些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 partial,它工作正常。 不需要搞乱全局variables(是的,我知道他们在前面有“@”,但是他们就是这样)。
你的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
在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 %>
另一种解决scheme是重新定义render
以接受:format
参数。
我无法得到render :file
与当地人一起工作,没有一些道路的好奇。
Rails 4将允许你传递格式参数。 所以你可以做
render(:partial => 'form', :formats => [:html])}
请注意,您可以在Rails 3中做类似的事情,但是它不会将这种格式传递给任何子部分(如果表单调用其他部分)。
你可以通过创buildconfig / 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/
在Rails 3中,View有一个格式数组,这意味着您可以将其设置为查找[:mobile,:html]。 设置,将默认寻找:手机模板,但回落到:HTML模板。 设置它的效果将会级联到内部部分。
最好但仍然有缺陷的方式,我可以find这个设置是把这条线放在每个完整的移动模板的顶部(但不是部分)。
<% 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
你有两个select:
1)使用render:file =>“foo / _baz.json.erb”
2)通过设置@template_formatvariables将模板格式更改为html
<% @template_format = "html" %> <%= h render(:partial => '/foo/baz') %>
我有一个名为'api / item.rabl'的文件,我想从HTML视图中渲染它,所以我不得不使用:
render file: 'api/item', formats: [:json]
( file
因为该文件名称中没有下划线, formats
不format
(和传递和数组))
看起来,传递formats
选项将适当地在更新的Rails版本,至less3.2:
{ someKey: 'some value', someHTML: "<%= h render('baz', formats: :html) -%>" }
当我尝试在另一个xml.builder视图文件中渲染XML部分时,我遇到了这个线程。 以下是一个很好的方法来做到这一点
xml.items :type => "array" do @items.each do |item| xml << render(:partial => 'shared/partial.xml.builder', :locals => { :item => item }) end end
还有…完整的文件名在这里工作…