Ruby on rails 这是RubyonRails中覆盖参数的奇怪行为吗?还是我再也不能忍受鲁比了?
预注释:我有一个解决方案,我想了解这里发生了什么,以及这种行为是否是有意的 编辑尝试一个可读性更好的快捷方式: 如果Rails控制器中有以下代码:Ruby on rails 这是RubyonRails中覆盖参数的奇怪行为吗?还是我再也不能忍受鲁比了?,ruby-on-rails,ruby,Ruby On Rails,Ruby,预注释:我有一个解决方案,我想了解这里发生了什么,以及这种行为是否是有意的 编辑尝试一个可读性更好的快捷方式: 如果Rails控制器中有以下代码: def get_page prepare_anythig params if is_it_monday? params=monday_default_paramms end finish_any_other_thing params end 这只在星期一有效 下面是一个小控制器的功能,我知道不是很
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
然后,我做了一个小的(好的,错误的或无效的,正如我现在知道的-或认为的)更改,我用'get params via base64 encode json'扩展了我的get_页面
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
后来我得到了一份工作,不使用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
(好吧,这是一个方法,我的错),即使不是在中,如果。。。结束
我再次问:这是想要的吗?如果,如何防止此类错误,而不必一直了解单词
后面的内容,比如参数
编辑
我的解决方案,但不是我问题的答案
我认为“错误”是因为你实际上在创建一个变量。代码注释:
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块之前立即初始化它(为零),而不管是否访问该块。可能只有我,但我发现你的问题很难理解。如果您知道问题可能发生在何处,将其抽象化将有助于快速解决。“(此处无需阅读)”->如在“真的无”中,空字符串为nil,或如错误在显示之前发生一样+1@BillyChan说了些什么,顺便说一句。这个问题很难理解。你能提供完整的回溯吗?@BillyChan:我明白了,很难理解,但我的大脑在这次搜索后不知怎么被弄伤了,我很高兴我是这样理解的“是Ruby解释器发现了事实”,这个“想法”让我提出了这个问题,这是故意的吗?我很确定是这样,因为这样做将允许生成一次操作代码,并随后使用它任意次数。这对我来说真的很难接受;如果(错误地)销毁或更改代码中的对象,则不会出现错误。但如果你犯了错误,你就会被杀死,因为你的代码没有被执行——这对我调试来说是一个新的困难世界。你没有破坏一个对象。根据我发布的代码的注释版本,局部变量在分配它之前是不存在的。该方法的初始版本总是调用params
方法。经过修改的版本将调用params
方法,直到解释器运行到您创建的(本地)params
变量中。如果需要从该点开始访问params
方法,则需要使用self.params
强制调用<代码>放置“?self.params:”,self.params以查看其作用。是的,实际上有两种技术方法:a)在您计划使用的范围内初始化变量(假设任何未初始化的都是方法调用),以及b)避免变量名和方法名之间的冲突(特别是与属性相关的方法)。在RoR上下文中尤其如此,因为它的文档隐式建议使用访问器方法(例如params
),而不是直接访问属性(@params
)。此外,使用ruby-w
)运行脚本;当您执行许多可能奇怪的操作时,它会显示警告。
? params:
{"ci"=>"10.203.192.83", "controller"=>"svg_test", "action"=>"get_the_page"}
json?
nil
? params:
_(nothing to read here)_
...
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