控制器问题:未定义的局部变量

时间:2015-05-18 11:20:24

标签: ruby-on-rails ruby ruby-on-rails-4 controller

控制器方法包括:

  @organization = Organization.find(params[:description])
  check_expiration_date(@organization)
  if @organization.update_attributes(subscription: true,
                                     actioncode: session[:actioncode_id],
                                     subs_exp_date: expiration_date)
  ...

  private
  def check_expiration_date(org)
    expiration_date = Time.zone.now + 366.days
  end

在开发服务器上,这会在下面生成错误,指的是行subs_exp_date: expiration_date

undefined local variable or method `expiration_date' for #<OrganizationsController:0x007f36cd01d2a8>

任何可能导致此错误的想法?我的想法是先执行check_expiration_date,然后设置变量expiration_date。

4 个答案:

答案 0 :(得分:2)

应该是这样的:

expiration_date

如果您看到代码,check_expiration_date是方法expiration_date中的变量,它仅将范围限制为该方法。因此,您无法在check_expiration_date之外使用变量def check_expiration_date(org) @expiration_date = Time.zone.now + 366.days end

其他方式可以将到期日期定义为实例变量。这里:

if @organization.update_attributes(... subs_exp_date: @expiration_date)

然后

{{1}}

这里的关键是:

  

将局部变量的范围与实例的范围进行对比   变量:实例变量绑定到特定的实例   班级。通过将自身绑定到整个对象,一个实例   变量使自己可用于对象的每个方法。

答案 1 :(得分:1)

解决方案1:

更改此代码:

check_expiration_date(@organization)

为:

expiration_date = check_expiration_date(@organization)

解决方案2:

变化:

  def check_expiration_date(org)
    expiration_date = Time.zone.now + 366.days
  end

为:

def check_expiration_date(org)
  @expiration_date = Time.zone.now + 366.days
end

然后:

if @organization.update_attributes(subscription: true,
                                     actioncode: session[:actioncode_id],
                                     subs_exp_date: @expiration_date)

原因:您正在尝试访问expiration_date,这是一个局部变量,其范围仅限于check_expiration_date方法,因此ruby正在寻找方法而不是变量。因此,您需要将其作为实例变量或从check_expiration_date方法的返回对象创建局部变量,以使其正常工作。

答案 2 :(得分:1)

这是因为您设置了局部变量expiration_date,它仅在方法体定义的当前范围内可见。如果你想在方法执行后使这个变量“可见”,你可以设置它的实例变量:

@expiration_date = Time.zone.now + 366.days

并使用它:

subs_exp_date: @expiration_date

有关Ruby变量范围的更多信息,您可以访问:

http://www.techotopia.com/index.php/Ruby_Variable_Scope

或在这里:

Difference between various variables scopes in ruby

答案 3 :(得分:0)

您正在调用局部变量而不是实例变量。它的范围可变。有两种方法可以为 subs_exp_date

获取正确的值
  1. 将局部变量转换为实例变量
  2.   

    @expiration_date = Time.zone.now + 366.days

    1. 直接调用方法的另一个选择
    2.   

      subs_exp_date:check_expiration_date(@organization)

相关问题