gpt4 book ai didi

ruby-on-rails - 那是带有覆盖参数的 ruby​​ on rails 奇怪行为吗?或者我只是再次不了解 ruby ?

转载 作者:太空宇宙 更新时间:2023-11-03 16:28:14 24 4
gpt4 key购买 nike

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

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

如果您在 Rails Controller 中有以下代码:

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

这只适用于星期一

下面是小 Controller 的功能,不是很有趣,我知道

    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"}

然后我做了一个小的(好的,错误的或无效的,因为我现在知道 - 或认为)改变,我用'get params via base64 encode 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)_

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

我再问一次:这是想要的吗?如果,如何在不始终了解 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 block 之后继续使用的事实,因此继续在您的 if block 之前立即将其初始化(为 nil),而不管该 block 是否被访问。

关于ruby-on-rails - 那是带有覆盖参数的 ruby​​ on rails 奇怪行为吗?或者我只是再次不了解 ruby ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20691255/

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