当前位置:  开发笔记 > 编程语言 > 正文

如何在Rails中呈现不同格式的部分?

如何解决《如何在Rails中呈现不同格式的部分?》经验,为你挑选了9个好方法。

我正在尝试生成包含一些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'没有帮助.



1> Tim Haines..:

从Rails 3.2.3开始,当调用render时:部分使用

:formats => [:html]

代替

:format => 'html'


如果你在respond_to块之外执行它,它就可以工作.
+1,但很抱歉夺走您的42分:(

2> Sam Stokes..:

怎么了?

render :partial => '/foo/baz.html.erb'

?我只是尝试这个从Atom构建器模板中呈现HTML ERB部分,它工作正常.不需要弄乱全局变量(是的,我知道他们面前有"@",但这就是他们的意思).

您的with_format &block方法很酷,并且具有仅指定格式的优点,而简单方法也指定模板引擎(ERB/builder/etc).


唯一的缺点是,如果你的部分呈现其他部分,它将失败,除非你进入并更改所有渲染部分调用以在其名称上包含".html.erb".
您不必为此指定模板引擎.(至少从轨道3开始).以下工作正常:render(:partial =>"baz.html")
这种方法的一个缺点是本地化将寻找`foo.baz.html.[your_string]`而不是`foo.baz.[your_string]`.zgchurc的答案是一个更好的解决方案.

3> zgchurch..:

对于Rails 3,with_format块可以工作,但它有点不同:

  def with_format(format, &block)
    old_formats = formats
    self.formats = [format]
    block.call
    self.formats = old_formats
    nil
  end



4> DrewB..:

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/



5> James A. Ros..:

基于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与当地人一起工作,也没有一些道路上的烦恼.


太讨厌我的口味了.最好指定整个扩展名.

6> 小智..:

在Rails 3中,View具有格式数组,这意味着您可以将其设置为查找[:mobile,:html].设置默认为寻找:移动模板,但回退到:html模板.设置它的效果将级联到内部部分.

我能找到的最好但仍然有缺陷的方法是将这条线放在每个完整移动模板的顶部(但不是部分).

<% self.formats = [:mobile, :html] %>

缺点是你必须将该行添加到多个模板.如果有人知道如何设置这个,从application_controller.rb,我很想知道它.不幸的是,将该行添加到移动布局中并不起作用,因为模板在布局之前呈现.



7> viphe..:

只是详细说明zgchurch所写的内容:

考虑例外情况

返回被调用块的结果

认为它可能有用.

def with_format(format, &block)
  old_formats = formats
  begin
    self.formats = [format]
    return block.call
  ensure
    self.formats = old_formats
  end
end



8> 小智..:

您有两种选择:

1)使用render:file =>"foo/_baz.json.erb"

2)通过设置@template_format变量将模板格式更改为html

render :file => "foo/_baz.json.erb"



9> Dorian..:

我有一个名为'api/item.rabl'的文件,我想从HTML视图中呈现它,所以我不得不使用:

render file: 'api/item', formats: [:json]

(file因为文件名中没有下划线,formats而不是format(和传递和数组))

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有