控制器问题:未定义的局部变量
Controller issue: undefined local variable
控制器方法包括:
@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.
应该是这样的:
if @organization.update_attributes(subscription: true,
actioncode: session[:actioncode_id],
subs_exp_date: check_expiration_date(@organization))
如果您看到您的代码,expiration_date
是方法 check_expiration_date
内的一个变量,它将其范围仅限于该方法。因此你不能在 check_expiration_date
.
之外使用变量 expiration_date
其他方法可以将到期日期定义为实例变量。这里:
def check_expiration_date(org)
@expiration_date = Time.zone.now + 366.days
end
然后
if @organization.update_attributes(... subs_exp_date: @expiration_date)
这里的关键是:
Contrast the scope of a local variable with that of an instance
variable: the instance variable is bound to the specific instance of
the class. By binding itself to the entire object, an instance
variable makes itself available to every method of the object.
解决方案一:
更改此代码:
check_expiration_date(@organization)
至:
expiration_date = check_expiration_date(@organization)
方案二:
变化:
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
方法的返回对象创建局部变量才能使其正常工作。
因为你设置了局部变量expiration_date
,它只在方法体定义的当前范围内可见。如果你想在方法执行后也使这个变量'visible',你可以设置它的实例变量:
@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
您调用的是局部变量而不是实例变量。它是关于变量范围的。有 2 个选项可以为 subs_exp_date
获取正确的值
- 将局部变量转换为实例变量
@expiration_date = Time.zone.now + 366.days
- 直接调用方法的另一个选项
subs_exp_date: check_expiration_date(@organization)
控制器方法包括:
@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.
应该是这样的:
if @organization.update_attributes(subscription: true,
actioncode: session[:actioncode_id],
subs_exp_date: check_expiration_date(@organization))
如果您看到您的代码,expiration_date
是方法 check_expiration_date
内的一个变量,它将其范围仅限于该方法。因此你不能在 check_expiration_date
.
expiration_date
其他方法可以将到期日期定义为实例变量。这里:
def check_expiration_date(org)
@expiration_date = Time.zone.now + 366.days
end
然后
if @organization.update_attributes(... subs_exp_date: @expiration_date)
这里的关键是:
Contrast the scope of a local variable with that of an instance variable: the instance variable is bound to the specific instance of the class. By binding itself to the entire object, an instance variable makes itself available to every method of the object.
解决方案一:
更改此代码:
check_expiration_date(@organization)
至:
expiration_date = check_expiration_date(@organization)
方案二:
变化:
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
方法的返回对象创建局部变量才能使其正常工作。
因为你设置了局部变量expiration_date
,它只在方法体定义的当前范围内可见。如果你想在方法执行后也使这个变量'visible',你可以设置它的实例变量:
@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
您调用的是局部变量而不是实例变量。它是关于变量范围的。有 2 个选项可以为 subs_exp_date
获取正确的值- 将局部变量转换为实例变量
@expiration_date = Time.zone.now + 366.days
- 直接调用方法的另一个选项
subs_exp_date: check_expiration_date(@organization)