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 选择设置一个局部变量。看到这两个答案:

于 2012-09-04T04:02:01.193 回答