rails找不到该属性

时间:2011-07-12 15:30:40

标签: ruby-on-rails ruby-on-rails-3 rails-models

我有这个模型

#post.rb
class Post < ActiveRecord::Base
    belongs_to :user
    after_initialize :create_token
    attr_accessible :token
    protected
    def create_token
      self.token = "#{Digest::MD5.hexdigest("#{self.id}")[0,4]}"
    end 
end
rails c

中的

Post.find(:all,:conditions => { :user_id => 11})
 => [#<Post id: 26, content: "<p><strong>Yao Ming</strong> (<a shape=\"rect\" title...", user_id: 11, created_at: "2011-07-12 15:08:30", updated_at: "2011-07-12 15:08:30", title: "Yao Ming", guid: "0010f6c3-040b-4e13-aa38-3a002e6f2022", contentHash: "\xB9\\\xCBK\xB0A>4\xC4~\xFC\"\xEA7\xA6y", token: "4e73">]

token: "4e73"时,但是当我尝试

Post.find(:all,:conditions => { :user_id => 11, :token => "4e73"}) 
 => []

我得到[],为什么?

更多信息

Post.find(:all,:conditions => { :user_id => 11}).first.token.class
=> String 

Post.find(:all,:conditions => { :user_id => 11}).first.token
=> "3769" 

4 个答案:

答案 0 :(得分:2)

根据Rails指南:

  

只要有活动记录,就会调用after_initialize回调   对象通过直接使用new或记录来实例化   从数据库加载。

您可能应该找到另一种方法来初始化此“令牌”字段,否则每次从数据库重新加载记录时都会更改它。

答案 1 :(得分:1)

正如Eugen所说,这就是问题所在,在所有情况下,Rails没有本地方法可以做到这一点,所以你需要做的是:

class Post < ActiveRecord::Base
    belongs_to :user
    after_initialize :create_token
    attr_accessible :token
    protected
    def create_token
        if new?
          self.token = "#{Digest::MD5.hexdigest("#{self.id}")[0,4]}"
        end
    end 
end

或只是

class Post < ActiveRecord::Base
    belongs_to :user
    attr_accessible :token
    protected
    def after_initialize
        if new?
          self.token = "#{Digest::MD5.hexdigest("#{self.id}")[0,4]}"
        end
    end 
end

答案 2 :(得分:1)

好吧,要根据id构建属性,id必须存在。最后,这样做:

after_create :create_token

def create_token
  self.token = "#{Digest::MD5.hexdigest("#{self.id}")[0,4]}"
  self.save
end

答案 3 :(得分:0)

我会用

before_create :create_token

所以它只在记录首次插入数据库时​​生成。