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_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?
4

2 に答える 2

2

その理由は、メソッドを呼び出していないためですredirect_to_new_order=redirect_to_new_orderむしろ、trueの値でローカル変数を設定しています。健全性チェックとして、raise "BOOM"割り当てメソッドに行を追加すると、メソッドが呼び出されていないことがわかります。

明示的なレシーバーが必要です。そうでない場合は、コントローラーにローカル変数を設定しています。

self.redirect_to_new_order = true

トリックを行います。

于 2012-09-03T21:06:34.277 に答える
0

ローカル変数を設定するのか、setterメソッドを呼び出すのかが明確でないためです。その場合、Rubyはローカル変数を設定することを選択します。次の2つの答えを参照してください。

于 2012-09-04T04:02:01.193 に答える