Лучший способ расширить состояния AASM restful_authentication - PullRequest
1 голос
/ 07 ноября 2008

Мне недавно пришлось расширить состояния AASM для последней версии restful_authentication (github) в одном из моих приложений. Я удалил «include Authorization :: AasmRoles», скопировал существующие состояния и события из плагина и внес изменения, необходимые для поддержки дополнительного «опубликованного» состояния в моей модели аккаунта.

У кого-нибудь есть более чистый способ справиться с этим? То есть просто переопределить состояние событий? Я смог добавить новые события с помощью плагина как есть, однако я не смог просто переопределить события состояния уже в restful_auth, поэтому мне пришлось удалить и включить его самостоятельно, используя его в качестве отправной точки.

1 Ответ

1 голос
/ 11 ноября 2008

Добавление состояния в AASM состоит из создания нового объекта State, который затем добавляется в массив AASM :: StateMachine [User] .states, который выглядит следующим образом:

def create_state(name, options)
 @states << AASM::SupportingClasses::State.new(name, options) unless @states.include?(name)
end

Здесь следует отметить, что он не позволит переопределить состояние после его установки. Если состояние с тем же именем устанавливается снова, метод create_state просто игнорирует его. Чтобы решить эту проблему, вы можете использовать что-то вроде этого в вашей пользовательской модели:

# this will remove the state with name :name from the states array 
states = AASM::StateMachine[self].states
states.delete(states.find{ |s| s == :name })
# ... so we can define the state here again
aasm_state :name ...

Если вы просто переопределяете состояние, у вас все будет хорошо. Но если вы хотите полностью удалить состояние, вам также следует отменить определение метода, определенного в теле метода aasm_state. Это должно быть возможно при вызове чего-то вроде:

undef_method :name

Ситуация должна быть такой же с событиями (просто используйте «события» вместо «состояний» в коде). В идеале, сделайте это методом класса пользовательской модели, который переопределяет методы, определенные в модуле AASM. В случае состояний это будет выглядеть так:

def aasm_state(name, options={})
  states = AASM::StateMachine[self].states
  states.delete(states.find{ |s| s == name.to_sym })
  super(name, options)
end

Предупреждение: я могу быть не прав. Этот код не проверен, я только что понял его, изучив исходный код AASM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...