2012-09-03 78 views
2

以下是我用来避免硬编码会话变量的一些代码。无法在Ruby on Rails中将会话写入会话

#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 

正如你所看到的,redirect_to_new_order?session[:redirect_to_new_order]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? 
+0

你更新还设置一个局部变量,而不是调用的方法。尝试在'method1'中打印'@ some_var'。你会发现它与'var1'不同,这意味着'var1'是一个局部变量而不是方法调用。 – Mischa

+0

绝对如此。为什么? –

+1

因为它被设计成设置一个局部变量。 Ruby不知道你的意图,它必须做点什么。请参阅下面我的答案中的两个链接。 – Mischa

回答

3

原因是你没有调用redirect_to_new_order=方法。而是你设置一个值为true的局部变量redirect_to_new_order。作为完整性检查,将一行raise "BOOM"添加到赋值方法中,您将看到该方法未被调用。

你需要一个明确的接收器,否则你要在你的控制器中设置一个局部变量。

self.redirect_to_new_order = true

会做的伎俩。

+0

这是真的。我已经知道了,但我不明白为什么。请看看我的更新。 –