【问题标题】:before_update syntaxbefore_update 语法
【发布时间】:2011-03-27 04:26:47
【问题描述】:

post.rb 模型

   after_update :assign_owner

   def assign_owner
      self.owner = "test"
   end

上述方法在终端中有效,但不会改变 Rails 中 Post.new.owner 的值。我错过了什么?

【问题讨论】:

    标签: ruby-on-rails ruby callback rails-activerecord


    【解决方案1】:

    这是更新后(需要保存对象)所以

    post = Post.new.save
    

    然后

    post.owner  # will be test
    

    如果你想这样做,你可能想使用after_initialize

    例如在 post.rb 中

    class Post < ActiveRecord::Base
      protected
        def after_initialize
          self.owner = "test
        end
    end
    

    【讨论】:

    • 警告说明:由于每个创建的对象都会调用 after_initialize,所以在找到它们时,我也会添加一个额外的测试:self.owner = "test" if self.owner.nil?if self.new_record? 否则你会始终更改所有者(例如更改为当前用户)。另请注意,这可能是一个严重的性能问题。
    【解决方案2】:

    after_update 仅在您更新对象时触发。创建时不会调用 after_update。

    当你想在创建新对象时调用方法时,你可以使用 after_create 回调。

      after_create :assign_owner
       after_update :assign_owner
    
       def assign_owner
          self.owner = "test"
       end
    

    【讨论】:

      【解决方案3】:

      after_updateafter_create 在对象保存后调用。您确实设置了 owner 的值,但没有保存它。

      两种可能的选择:改用before_update --> 您的对象尚未保存,您的更改将正确保存。

      或者使用after_update,写成如下:

      def assign_owner
        self.update_attribute :owner, "test"
      end
      

      注意:任何回调只会在保存之前或之后调用,所以Post.new.owner 仍然是错误的。但Post.create(:context =&gt; 'blabla') 应该正确触发它(或Post.new.save)。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-05
        • 1970-01-01
        • 2022-08-06
        • 1970-01-01
        • 2015-07-16
        相关资源
        最近更新 更多