Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails使用错误的格式将\u呈现为\u字符串_Ruby On Rails_Ruby On Rails 3_Rspec - Fatal编程技术网

Ruby on rails Rails使用错误的格式将\u呈现为\u字符串

Ruby on rails Rails使用错误的格式将\u呈现为\u字符串,ruby-on-rails,ruby-on-rails-3,rspec,Ruby On Rails,Ruby On Rails 3,Rspec,我在使用Rails 3.2.18时遇到了一个问题,即函数试图呈现错误的视图格式,尽管它的:formats选项设置正确(例如,当:formats设置为text时呈现kml视图) TL-DR版本: 如果我调用render\u to_string('foos/bar',formats:'text',layout:false),然后render\u to_string('foos/bar',formats:'json',layout:false),后面的程序将呈现bar.text,而不是bar.jso

我在使用Rails 3.2.18时遇到了一个问题,即函数试图呈现错误的视图格式,尽管它的
:formats
选项设置正确(例如,当
:formats
设置为
text
时呈现
kml
视图)


TL-DR版本: 如果我调用
render\u to_string('foos/bar',formats:'text',layout:false)
,然后
render\u to_string('foos/bar',formats:'json',layout:false)
,后面的程序将呈现
bar.text
,而不是
bar.json


长版本: 我有一个
fooscontroller
,当调用它的
bar
操作时,它使用
render\u to\u text
bar
可以响应三种格式:
text
json
kml
。在我的视图下,我有三个相应的文件
bar.text.erb
bar.json.erb
bar.kml.erb
。我还有三个不同的测试,其中控制器被实例化,
bar
的输出被测试为不同的格式(因此我调用
fooscontroller.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
其他一些精度:
-无论我使用的是
格式:'
还是
格式:['']

-无论我是使用断点在同一控制器内使用不同的
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)

我真不敢相信解决办法这么简单。我仍然很困惑,为什么它不能和文本版本一起使用。。。我猜在我的格式上用一个简单的
to_sym
就可以了。@Hyruu这不仅仅是因为你在尝试使用
字符串
,还因为它需要一个
数组
formats
参数是复数形式。虽然也保留了这个参数,但问题似乎是在Rails更新到3.2.18时出现的。听起来像是一个版本特定的bug