gpt4 book ai didi

ruby-on-rails - Rails render_to_string 使用错误的格式

转载 作者:行者123 更新时间:2023-12-05 03:10:13 25 4
gpt4 key购买 nike

我遇到了 render_to_string 的问题使用 Rails 3.2.18,其中函数试图呈现错误的 View 格式,尽管其 :formats选项设置正确(例如,当 kml 设置为 :formats 时呈现 text View )。


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使用render_to_text当它 bar调用 Action 。 bar可以响应三种格式:text , jsonkml .在我看来,我有三个对应的文件bar.text.erb , bar.json.erbbar.kml.erb .我还有三个不同的测试,其中 Controller 被实例化,输出 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_stringjson格式呈现 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 !

我似乎无法理解为什么会出现此问题,因为问题与 View 无关 - 它们都存在并且可以如前所示呈现。更奇怪的是,如果我在渲染中强制使用格式而不是使用 :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,问题都会发生在同一个 Controller 中使用断点或者我是否简单地调用 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)

关于ruby-on-rails - Rails render_to_string 使用错误的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40588655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com