Я добавляю несколько столбцов в одну из моих таблиц базы данных, а затем заполняю эти столбцы:
def self.up
add_column :contacts, :business_id, :integer
add_column :contacts, :business_type, :string
Contact.reset_column_information
Contact.all.each do |contact|
contact.update_attributes(:business_id => contact.client_id, :business_type => 'Client')
end
remove_column :contacts, :client_id
end
Строка contact.update_attributes
вызывает следующую ошибку Authlogic:
You must activate the Authlogic::Session::Base.controller with a controller object before creating objects
Понятия не имею, что здесь происходит - я не использую метод контроллера для изменения каждой строки в таблице. Я также не создаю новые объекты.
Ошибка не возникает, если таблица контактов пуста.
У меня был гугл, и похоже, что эта ошибка может возникать при запуске тестов вашего контроллера, и исправляется добавлением к ним before_filter :activate_authlogic
, но в моем случае это не актуально.
Есть идеи? Я в тупике.
Вот моя модель контакта по запросу:
class Contact < ActiveRecord::Base
belongs_to :contactable, :polymorphic => true
has_many :phone_numbers, :as => :callable
has_many :email_addresses, :as => :emailable
accepts_nested_attributes_for :phone_numbers
accepts_nested_attributes_for :email_addresses
validates_presence_of :first_name, :last_name
validates_format_of :first_name, :last_name, :with => /^[-a-zA-Z ]+$/
default_scope :order => 'first_name ASC, last_name ASC'
def full_name
"#{self.first_name} #{self.last_name}"
end
def to_s
full_name
end
end
Информация о версии: Rails 2.3.5, Authlogic 2.1.3
rake db: migrate - вывод трассировки можно найти на сайте pastie здесь: http://pastie.org/944446
Информация наблюдателя:
У меня есть ActivityObserver
, который наблюдает за моей Contact
моделью и создает Activity
с помощью обратного вызова after_update
.
В моей Activity
модели я хакерски ассоциирую @current user
с деятельностью, создаваемой с помощью обратного вызова before_save
.
Вот соответствующие фрагменты кода:
class ActivityObserver < ActiveRecord::Observer
observe :contact
def after_update(subject)
Activity.create(:action => 'Updated', :subject => subject)
end
end
class Activity < ActiveRecord::Base
belongs_to :subject, :polymorphic => true
belongs_to :user
def before_save
# FIXME: This is a messy hack way to get the user's id
self.user = UserSession.find.record
end
end
Это определенно , где Authlogic принимает участие. KandadaBoggu - победитель - большое спасибо за понимание !!!
Что касается исправлений, я думаю, что в принципе их нет. Если я хочу создать действие, когда мой контакт обновляется посредством миграции, по определению нет @current_user
для связи. Я подумаю, как обойти это, но Кандада Боггу определенно ответила на мой вопрос.