对于overwrite params,这是一种ruby on rails的奇怪行为吗?还是我再也不喜欢红宝石了



预注释:我有一个解决方案,我想了解这里发生了什么,以及这种行为是否是

编辑尝试一个可读性更好的快捷方式:

如果您在RailsController中有以下代码:

def get_page
prepare_anythig params
if is_it_monday?
params=monday_default_paramms
end
finish_any_other_thing params
end 

这只适用于周一

以下是功能很小的控制器功能,不是很有趣,我知道

class SvgTestController < SiteController
def get_the_page
require "base64"
@main_width="auto"
params[:ci]||=['default']
puts  "? params:",params
generate_drawing(params, false)
render ...
end
end 

控制台向我展示了预期效果:

? params:
{"ci"=>"not default", "controller"=>"svg_test", "action"=>"get_the_page"}       

然后我做了一个小的(好的,错误的或无效的,我现在知道或认为)更改,我用"通过base64编码json获取参数"扩展了我的get_the_page

class SvgTestController < SiteController
def get_the_page
require "base64"
@main_width="auto"
params[:ci]||=['default']
# add here
puts  "? params:",params
json=params[:json]
puts "json?",json.inspect
if json
plain = Base64.decode64(json)
puts "we are in here:", plain
params=JSON.parse(plain).with_indifferent_access
puts  "? params now:",params
end
# end
puts  "? params:",params
generate_drawing(params, false)
render ...
end
end 

解决方案运行良好,输出如下:

? params:
{"json"=>"eyJjaSI6eyIwMDAwMDAwMDAyMDQ4MDgiOnsic3J2IjoxfX19", "controller"=>"svg_test", "action"=>"get_the_page", "ci"=>["default"]}      
json?
"eyJjaSI6eyIwMDAwMDAwMDAyMDQ4MDgiOnsic3J2IjoxfX19"
we are in here:
{"ci":{"000000000204808":{"srv":1}}}
? params now:
{"ci"=>{"000000000204808"=>{"srv"=>1}}}
? params:
{"ci"=>{"000000000204808"=>{"srv"=>1}}}

后来我得到了,不使用JSON逻辑

NoMethodError in SvgTestController#get_the_page
undefined method `[]' for nil:NilClass

我的控制台显示:

? params:
{"ci"=>"10.203.192.83", "controller"=>"svg_test", "action"=>"get_the_page"}
json?
nil
? params:
_(nothing to read here)_                

所以ruby覆盖了我的params(好吗,这是一个方法,我的错),即使不在if ... end中?

我再次问道:这是想要的吗?如果,在不知道wordsparams背后的一切的情况下,如何防止这种错误?

编辑

我的解决方案,但不是我的问题的答案

...
params_used=params
json=params[:json]
if json
plain = Base64.decode64(json)
params_used=JSON.parse(plain).with_indifferent_access
end
puts  "? params:",params_used
generate_drawing(params_used, false)

我认为"错误"是因为您实际上正在创建变量。代码注释:

def get_the_page
require "base64"
@main_width="auto"
params[:ci]||=['default']        # params method
# you modified @params, a mutable hash
# add here
puts  "? params:",params         # params method
json=params[:json]               # params method
# you accessed @params[:json]
puts "json?",json.inspect
if json
plain = Base64.decode64(json)
puts "we are in here:", plain
params=JSON.parse(plain).with_indifferent_access  # params variable
puts  "? params now:",params                      # params variable
end
# end
puts  "? params:",params                              # params variable
generate_drawing(params, false)                       # params variable
render ...
end

我敢打赌,现在发生的事情是,Ruby解释器发现了一个事实,即一个名为params变量在if块之后继续使用,所以无论该块是否被访问,都会在if块之前立即初始化它(为零)。

最新更新