Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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 这是RubyonRails中覆盖参数的奇怪行为吗?还是我再也不能忍受鲁比了?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 这是RubyonRails中覆盖参数的奇怪行为吗?还是我再也不能忍受鲁比了?

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 这只在星期一有效 下面是一个小控制器的功能,我知道不是很

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

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

如果Rails控制器中有以下代码:

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