Я знаю, я знаю, если вы обращаетесь к переменным сеанса или переменным экземпляра в вашей модели, вы не понимаете шаблон MVC и «должны вернуться к PHP». Но, тем не менее, это может быть очень полезно, если у вас - как и у нас - много контроллеров и действий, для которых вы не всегда хотите писать @ current_account.object.do_something (не очень СУХОЙ).
Решение, которое я нашел, очень просто:
Шаг 1:
Добавьте свой current_account в Thread.current, например,
class ApplicationController < ActionController::Base
before_filter :get_current_account
protected
def get_current_account
# somehow get the current account, depends on your approach
Thread.current[:account] = @account
end
end
Шаг 2:
Добавьте метод current_account ко всем вашим моделям
#/lib/ar_current_account.rb
ActiveRecord::Base.class_eval do
def self.current_account
Thread.current[:account]
end
end
Шаг 3: Вуаля, в своих моделях вы можете сделать что-то вроде этого:
class MyModel < ActiveRecord::Base
belongs_to :account
# Set the default values
def initialize(params = nil)
super
self.account_id ||= current_account.id
end
end
Вы также можете работать с чем-то вроде обратного вызова before_validation в active_record, а затем сделать с проверкой, что учетная запись всегда установлена.
Тот же подход можно использовать, если вы всегда хотите добавить current_user к каждому созданному объекту.
Что вы думаете?