Rails render_to_string使用错误的格式

时间:2016-11-14 12:20:39

标签: ruby-on-rails ruby-on-rails-3 rspec

我遇到了render_to_string使用Rails 3.2.18的问题,其中函数尝试呈现错误的视图格式,尽管正确设置了:formats选项(例如渲染{{ 1}} kml设置为:formats时的视图。

TL-DR版本:

如果我拨打text然后再拨打render_to_string('foos/bar', formats: 'text', layout: false),则后者会提取render_to_string('foos/bar', formats: 'json', layout: false)而不是bar.text

长版:

我有bar.json在调用FoosControler操作时使用render_to_textbar可以回复三种格式:bartextjson。根据我的观点,我有三个相应的文件kmlbar.text.erbbar.json.erb。我还有三个不同的测试,其中控制器被实例化,bar.kml.erb的输出被测试为不同的格式(所以我打电话给bar)。

如果我独立完成每项测试,我完全没有问题。所以:

FoosControler.new.bar(format)

如果我的测试套件中有多个问题,问题就会出现。会发生以下情况:

render_to_string('foos/bar', formats: 'text', layout: false)
# => renders bar.text.erb


render_to_string('foos/bar', formats: 'json', layout: false)
# => renders bar.json.erb


render_to_string('foos/bar', formats: 'kml', layout: false)
# => renders bar.kml.erb

从我呈现render_to_string('foos/bar', formats: 'json', layout: false) # => renders bar.json.erb render_to_string('foos/bar', formats: 'text', layout: false) # => renders bar.text.erb render_to_string('foos/bar', formats: 'json', layout: false) # => renders bar.text.erb instead of bar.json.erb ! 的那一刻开始,对bar.text.erb格式render_to_string的任何调用都会呈现json而不是bar.text.erb。{ / p>

bar.json.erbkml

之间也是如此
txt

我似乎无法理解为什么会出现这个问题,因为问题没有与视图相关联 - 它们都存在并且可以如前所示进行渲染。更奇怪的是,如果我在渲染中强制使用格式而不是使用render_to_string('foos/bar', formats: 'text', layout: false) # => renders bar.text.erb render_to_string('foos/bar', formats: 'kml', layout: false) # => renders bar.kml.erb render_to_string('foos/bar', formats: 'text', layout: false) # => renders bar.kml.erb instead of bar.text.erb ! 参数,那么一切都有效:

:format

其他一些准则:
- 我使用render_to_string('foos/bar.text', layout: false) # => renders bar.text.erb render_to_string('foos/bar.kml', layout: false) # => renders bar.kml.erb render_to_string('foos/bar.text', layout: false) # => renders bar.text.erb like it is supposed to 还是formats: '<format>'来无关紧要 - 无论我是否使用断点在同一控制器内使用不同的formats: ['<format>'],或者我是否只是在测试中调用render_to_string的序列,问题就会发生,因此以下两个给出相同的结果:< / p>

FoosController.new.bar(format)

知道什么可能导致这种不必要的行为吗?强制像我这样的格式似乎修补了这个问题,但我仍然想知道到底发生了什么。

1 个答案:

答案 0 :(得分:2)

从此处更改格式选项:

render_to_string('foos/bar', formats: 'text', layout: false)
# => renders bar.text.erb
render_to_string('foos/bar', formats: 'kml', layout: false)
# => renders bar.kml.erb
render_to_string('foos/bar', formats: 'text', layout: false)
# => renders bar.kml.erb instead of bar.text.erb !

对此:

render_to_string('foos/bar', :formats => [:text], layout: false)
render_to_string('foos/bar', :formats => [:kml], layout: false)
render_to_string('foos/bar', :formats => [:text], layout: false)