Rails - 模型更改未在控制器和模型之间保存或保留

时间:2011-12-03 20:31:45

标签: ruby-on-rails ruby class instance

我很感激任何帮助,我可以通过我的代码中的一些奇怪的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引用了类,而不是类实例。如果有人能澄清发生了什么,我将不胜感激 - 谢谢!

2 个答案:

答案 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