Как сохранить переменную под рукой на нескольких контроллерах - PullRequest
0 голосов
/ 05 декабря 2011

Я переместил приложение в ActiveResource и обнаружил, что мне нужно переосмыслить способ, которым я учил себя делать некоторые вещи, и я ищу лучший способ сделать это.

Например, мне нужно держать под рукой запрос @current_account, который я сделал как

@current_account ||= Account.where(etc etc)

в applicationcontroller.rb для определенной области.Это не так уж и полезно с AR, потому что вызов API выполняется каждый раз.Я хотел бы свести к минимуму количество вызовов к API (особенно там, где у меня есть другие более дорогие вызовы, которые я не хочу выполнять при каждом запросе, я хочу выполнить их один раз и сохранить их под рукой)

Итак, что такоеRails кстати?Я должен держать переменную с вызовом AR API-интерфейса под рукой из ApplicationController в определенной области, на нескольких других контроллерах, без необходимости каждый раз записывать его (или вызывать API каждый раз, или помещать его в сеанс, доступный для пользователя).потому что это не совсем текст / строки, это объекты, которые мне нужно использовать).

Мне любопытно, как другие делают это, если я должен или не должен делать это, каков правильный СУХОЙ способ и т. Д. Так что это несколько открыто.

Любойвход оценили.

1 Ответ

1 голос
/ 06 декабря 2011

Лучше всего создать модуль для такого поведения:

module CustomAuth
  def self.included(controller)
    controller.send :helper_method, :current_account, :logged_in?
  end

  def current_account
    # note the Rails.cache.fetch. First time, it will
    # make a query, but it caches the result and not
    # run the query a second time.
    @current_account ||= Rails.cache.fetch(session[:account_id], Account.where(...))
  end

  def logged_in?
    !current_account.nil?
  end
end

Затем убедитесь, что Rails загружает этот файл (я поместил свой в ./lib/custom_auth.rb), поэтому добавьте его в config.autoload_paths in ./config/application.rb:

# ./config/application.rb
...
config.autoload_path += %W(#{config.root}/lib)
...

Импортируйте модуль CustomAuth в application_controller.rb:

class ApplicationController < ActionController::Base
  include CustomAuth
  protect_from_forgery

  ...
end

Наконец, крайне важно: Перезагрузите сервер

ПРИМЕЧАНИЕ. Вы можете добавить дополнительные методы к custom_auth.rb.Если вы перезапустите сервер, они будут доступны.Эти методы также доступны в представлении, поэтому вы можете вызвать current_account.name прямо внутри представления.

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