2012-09-03 114 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

這是真的。我已經知道了,但我不明白爲什麼。請看看我的更新。 –