我遇到了render_to_string
使用Rails 3.2.18的问题,其中函数尝试呈现错误的视图格式,尽管正确设置了:formats
选项(例如渲染{{ 1}} kml
设置为:formats
时的视图。
如果我拨打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_text
。 bar
可以回复三种格式:bar
,text
和json
。根据我的观点,我有三个相应的文件kml
,bar.text.erb
和bar.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.erb
和kml
:
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)
知道什么可能导致这种不必要的行为吗?强制像我这样的格式似乎修补了这个问题,但我仍然想知道到底发生了什么。
答案 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)