Rails render_to_string 使用了错误的格式
Rails render_to_string using wrong format
我在 render_to_string
使用 Rails 3.2.18 时遇到问题,尽管 :formats
选项设置正确(所以例如,当 :formats
设置为 text
) 时渲染 kml
视图。
TL-DR 版本:
如果我调用 render_to_string('foos/bar', formats: 'text', layout: false)
然后调用 render_to_string('foos/bar', formats: 'json', layout: false)
,则后者呈现 bar.text
而不是 bar.json
长版:
我有一个 FoosControler
,它在调用 bar
操作时使用 render_to_text
。 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
的那一刻起,任何使用 json
格式调用 render_to_string
都会呈现 bar.text.erb
而不是像它应该的那样 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
还是在测试中简单地调用 FoosController.new.bar(format)
序列,问题都会发生,因此以下两个给出相同的结果:
FoosController.new.bar
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 !
FoosController.new.bar('kml')
# => renders bar.kml.erb
FoosController.new.bar('text')
# => renders bar.kml.erb instead of bar.text.erb !
知道什么会导致这种不良行为吗?像我一样强制格式似乎可以解决问题,但我仍然想知道到底发生了什么。
从此更改您的格式选项:
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)
我在 render_to_string
使用 Rails 3.2.18 时遇到问题,尽管 :formats
选项设置正确(所以例如,当 :formats
设置为 text
) 时渲染 kml
视图。
TL-DR 版本:
如果我调用 render_to_string('foos/bar', formats: 'text', layout: false)
然后调用 render_to_string('foos/bar', formats: 'json', layout: false)
,则后者呈现 bar.text
而不是 bar.json
长版:
我有一个 FoosControler
,它在调用 bar
操作时使用 render_to_text
。 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
的那一刻起,任何使用 json
格式调用 render_to_string
都会呈现 bar.text.erb
而不是像它应该的那样 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
还是在测试中简单地调用 FoosController.new.bar(format)
序列,问题都会发生,因此以下两个给出相同的结果:
FoosController.new.bar
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 !
FoosController.new.bar('kml')
# => renders bar.kml.erb
FoosController.new.bar('text')
# => renders bar.kml.erb instead of bar.text.erb !
知道什么会导致这种不良行为吗?像我一样强制格式似乎可以解决问题,但我仍然想知道到底发生了什么。
从此更改您的格式选项:
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)