Синтаксис before_update - PullRequest
       11

Синтаксис before_update

1 голос
/ 27 марта 2011

post.rb Модель

   after_update :assign_owner

   def assign_owner
      self.owner = "test"
   end

Вышеуказанный метод работает в терминале, но не изменяет значение Post.new.owner в Rails. Что мне не хватает?

Ответы [ 3 ]

4 голосов
/ 27 марта 2011

Это после обновления (объект должен быть сохранен), поэтому

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
1 голос
/ 27 марта 2011

after_update срабатывает только при обновлении вашего объекта. after_update не будет вызывать при создании.

Вы можете использовать обратный вызов after_create, когда хотите вызвать метод при создании нового объекта.

  after_create :assign_owner
   after_update :assign_owner

   def assign_owner
      self.owner = "test"
   end
0 голосов
/ 27 марта 2011

after_update и after_create вызываются после сохранения объекта.Вы устанавливаете значение owner, но не сохраняете его.

Два возможных варианта: вместо этого используйте before_update -> ваш объект еще не сохранен, и ваши изменения будут сохранены правильно.

Или используйте after_update и напишите его следующим образом:

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

Примечание: любой обратный вызов будет вызываться только непосредственно перед или сразу после сохранения, поэтому Post.new.owner все равно будет неправильным.Но Post.create(:context => 'blabla') должен вызвать его правильно (или Post.new.save).

Надеюсь, это поможет.

...