预注释:我有一个解决方案,我想了解这里发生了什么,以及这种行为是否是
编辑尝试一个可读性更好的快捷方式:
如果您在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
中?
我再次问道:这是想要的吗?如果,在不知道words
和params
背后的一切的情况下,如何防止这种错误?
编辑
我的解决方案,但不是我的问题的答案
...
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块之前立即初始化它(为零)。