我很感激任何帮助,我可以通过我的代码中的一些奇怪的phenonemon。控制器的创建方法(大致)如下:
def create
@session ||= Session.new
@session.date = params[:date]
@session.generate_string
@session.save
# etc
end
模特:
class Session < ActiveRecord::Base # table is 'sessions' with 3 columns :id, :str, :date
include MyHelper
def generate_string(num_chars)
@str ||= ""
num_chars.to_i.times do
@str += some_method_in_MyHelper() # method returns a string
end
end
end
通过一些日志记录,我发现虽然generate_string工作正常,但结果@session(在控制器中)的日期设置为预期,但str的值是一个空字符串。果然,当.save被击中时,数据库被告知插入一个由空白字符串和正确日期组成的记录。
我发现这个Why do my changes to model instances not get saved sometimes in Rails 3?表明我应该使用“self”前缀而不是@。这似乎使代码按预期工作,但似乎很奇怪因为我认为self.xxx引用了类,而不是类实例。如果有人能澄清发生了什么,我将不胜感激 - 谢谢!
答案 0 :(得分:1)
self
是指在实例方法中使用的实例。它指的是外部类的实例方法,当它(self
)是正在定义的类时。
@
是一个实例变量,与ActiveRecord
列不同。
答案 1 :(得分:0)
要将其存储在要保存到数据库的str
字段中,您需要使用self.str
方法。我认为这就是你要找的东西
class Session < ActiveRecord::Base # table is 'sessions' with 3 columns :id, :str, :date
include MyHelper
def generate_string(num_chars)
str = ""
num_chars.to_i.times do
str += some_method_in_MyHelper() # method returns a string
end
self.str = str # store it in attribute to be saved into db
end
end
注意我删除了实例变量@str
并将其更改为局部变量str
,因为每次调用此方法时,您似乎想生成一个新字符串?此外,这种变量缓存是无用的
@session ||= Session.new
因为实例变量只适用于单个请求。它应该是
@session = Session.new