Rails 4模型属性不可设置

时间:2013-07-05 02:29:44

标签: ruby-on-rails activerecord

在Rails 4中,我有一个与usertemplate有关系的消息模型。它还有自己的属性text

class Message < ActiveRecord::Base
attr_accessor :text

belongs_to :user
belongs_to :template

validates :user, presence: true
validates :template, presence: true
validates :text, presence: true, if: lambda { |message| message.template.present? }

    def initialize(args = {})
      super
      @user = args[:user]
      @template = args[:template]
      @text = args[:text] || (args[:template].text if args[:template].present?)
    end

end

这是我的问题: (假设我已经usertemplate了 当我运行message = Message.create!(user: user, template: template, "hello world")message.text将等于"hello world",但是当我从数据库中检索此记录时,text属性为nil,所有其他属性都可以。

是什么给出的?为什么text没有被持久化到数据库?

1 个答案:

答案 0 :(得分:0)

  1. 没有理由根据您提供的代码,为什么要覆盖ActiveRecord::Base.initialize方法。这通常是不好的做法。 @user@template上的设定者根本不需要; Rails将通过基本初始化方法为您设置模型属性。
  2. 您应该在@text块中提供after_initialize setter的默认功能

    after_initialize do
      self.text = self.template if self.text.blank? && self.template.present?
    end
    
  3. 如果:text确实是模型属性(与数据库中的列匹配),则不应在attr_accessor :text上调用Message模型。它对您没有任何好处,并会覆盖ActiveRecord::Basetext方法的text=功能。