0

我有这个简单的 Rails 代码,但发生了一些奇怪的事情。如您所见params.nil?true它仍在调用 else 部分。我在这里想念什么?

撬会话

     5: def build_resource
     6:   binding.pry
     7:   if params.nil?
     8:     model_class.new
     9:   else
 => 10:     params = params.merge(dealer: {})
    11:     model_class.new(dealer_params)
    12:   end
    13: end

[3] pry(#<Admin::DealersController>):1> params.nil?
true
4

2 回答 2

1

不,这不是一个撬问题。您只是不能将参数重新分配给参数。尝试使用不同的变量。这应该可以正常工作。

您可以用作

dealer_params = params.merge(dealer: {})

更新的答案

深入挖掘 Rails。看看这个。

class Parameters

cattr_accessor :permit_all_parameters, instance_accessor: false, default: false

cattr_accessor :action_on_unpermitted_parameters, instance_accessor: false

.....
end

简单解释:params 负责携带您允许在控制器内部的值,但它的辞职将返回 false 或 nil。您可以深入了解这些主题。

https://apidock.com/rails/Class/cattr_accessor

这就是为什么当您声明新变量时,会将 params => (object) 的值分配给它。但是,当您对返回对象的参数或方法执行相同操作时,这将返回 nil。

相同的答案:您不能将参数重新分配给参数。

于 2018-05-04T19:07:39.537 回答
0

所以,这回答了我的问题(https://stackoverflow.com/a/1335890):

包含请求参数的参数实际上是一个方法调用,它返回包含参数的哈希。您的 params = 行正在分配给一个名为 params 的局部变量。

在 if false 块之后,Ruby 已经看到了本地 params 变量,因此当您稍后在方法中引用 params 时,本地变量优先于调用同名方法。但是,因为您的 params = 赋值位于 if false 块内,所以局部变量永远不会被赋值,因此局部变量为零。

如果您在分配给它之前尝试引用一个局部变量,您将得到一个 NameError:

irb(main):001:0> baz
NameError: undefined local variable or method `baz' for main:Object
        from (irb):1

但是,如果对不在代码执行路径中的变量进行赋值,则 Ruby 已创建局部变量,但其值为 nil。

irb(main):007:0> baz = "Example" if false
=> nil
irb(main):008:0> baz
=> nil
于 2018-05-04T20:20:46.577 回答