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不知道你的意图,它必须做点什么。请参阅下面我的答案中的两个链接。