控制器方法包括:
@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。
答案 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
或在这里:
答案 3 :(得分:0)
您正在调用局部变量而不是实例变量。它的范围可变。有两种方法可以为 subs_exp_date
获取正确的值@expiration_date = Time.zone.now + 366.days
subs_exp_date:check_expiration_date(@organization)