如何在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因为该文件名称中没有下划线, formatsformat (和传递和数组))

看起来,传递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 

还有…完整的文件名在这里工作…