Ruby on rails 3.2 无法将变量写入Ruby on Rails中的会话
下面是一些我用来避免硬编码会话变量的代码Ruby on rails 3.2 无法将变量写入Ruby on Rails中的会话,ruby-on-rails-3.2,Ruby On Rails 3.2,下面是一些我用来避免硬编码会话变量的代码 #application_controller def redirect_to_new_order? session[:redirect_to_new_order] end def redirect_to_new_order=(value) session[:redirect_to_new_order] = value end #another_controller #............. def some_ac
#application_controller
def redirect_to_new_order?
session[:redirect_to_new_order]
end
def redirect_to_new_order=(value)
session[:redirect_to_new_order] = value
end
#another_controller
#.............
def some_action
redirect_to_new_order = true
#viewed by debugger
# redirect_to_new_order? is equal to nil
# session[:redirect_to_new_order] is equal to nil as well
end
正如您所看到的,重定向到新订单?
和会话[:重定向到新订单]
出于某种原因是nil
为什么会这样
更新:
下面是一个类似于上面给出的代码。但它确实调用了一个方法,并且没有创建局部变量。为什么?
class SomeClass
def initialize
@some_var = "999"
end
def var1
@some_var
end
def var1=(value)
@some_var=value
end
def method1
var1 = 111
puts var1
puts @some_var
end
end
a = SomeClass.new
a.method1 # prints 111 and 999 but why?
原因是您没有调用
redirect\u to\u new\u order=
方法。而是设置一个局部变量重定向到\u new\u order
,值为true。作为健全性检查,在赋值方法中添加一行raise“BOOM”
,您将看到该方法没有被调用
您需要一个显式接收器,否则您将在控制器中设置一个局部变量
self.redirect\u to\u new\u order=true
将执行此操作。因为不清楚您是要设置局部变量还是调用setter方法。在这种情况下,Ruby选择设置一个局部变量。请看以下两个答案:
当然,这是真的。我已经知道了,但我还不明白为什么。请看我的更新。你的更新还设置了一个局部变量,而不是调用一个方法。尝试在
method1
中打印@some\u var
。您将看到它不同于var1
,这意味着var1
是一个局部变量,而不是一个方法调用。因为它是为设置局部变量而设计的。Ruby不知道你的意图,它必须做点什么。请参阅下面我的答案中的两个链接。