代码之家  ›  专栏  ›  技术社区  ›  tybro0103

创建回调后的Rails无法访问模型的属性

  •  5
  • tybro0103  · 技术社区  · 15 年前

    我无法在“创建后”回调中访问模型的属性。。。看来我应该可以对吧?

    控制器:

    @dog = Dog.new(:color => 'brown', :gender => 'male')
    @dog.user_id = current_user.id
    @dog.save
    

    class Dog < ActiveRecord::Base
      def after_create
        logger.debug "[DOG CREATED] color:#{color} gender:#{gender} user:#{user_id}"
      end
    end
    

    安慰:(一切似乎都很好)

    >>Dog.last
    =>#<Dog id: 1, color: "brown", gender: "male", user_id: 1>
    

    日志:(wtf!?)

    ...
    [DOG CREATED] color: gender:male user
    ...
    

    我的某些属性会出现,而其他属性不会出现!哦,不!有人知道我做错了什么吗?在过去,我总是能够以这种方式创建用户。

    4 回复  |  直到 15 年前
        1
  •  4
  •   tybro0103    15 年前

    其中一个属性是虚拟的,我在其中使用self.update\u属性…哎呀!

    def price=(amt)
      self.update_attribute(:price_in_cents, (amt*100.0).to_i)
    end
    

    下次我一定会发完整的代码!

        2
  •  0
  •   Jimmy Baker    15 年前

    请尝试以下操作:

    class Dog < ActiveRecord::Base
      def after_create(dog)
        logger.debug "[DOG CREATED] color:#{dog.color} gender:#{dog.gender} user:#{dog.user_id}"
      end
    end
    
        3
  •  0
  •   Salil    15 年前

    在尚未保存的新对象(不存在记录)上,在Base.save之后调用\u create()。注意,这个回调仍然包装在save的事务中。例如,如果此时调用外部索引器,它将看不到数据库中的更改。

        4
  •  0
  •   mikewilliamson    15 年前

    一般来说,宏样式回调可能比简单地重写方法更好。它允许您在生命周期中同时启动几个不同的方法(如果需要的话)。我想你需要的是:

    class Dog < ActiveRecord::Base
      after_create :dog_logger
    
      def dog_logger
            logger.debug "[DOG CREATED] color:#{self.color} gender:#{self.gender} user:#{self.user_id}"
      end
    end