Как установить в промежуточном программном обеспечении переменную, доступную во всех моих приложениях? - PullRequest
9 голосов
/ 04 марта 2011

Я использую Ruby on Rails 3 и пытаюсь использовать промежуточное ПО для установки переменной @variable_name, доступной позже в контроллерах.

Например, мое промежуточное ПО

  class Auth

    def initialize(app)
      @app = app
    end

    def call(env)
      @account ||= Account.find(1)

      @app.call(env)
    end
  end

Приведенный выше код правильно устанавливает переменную @account, но она недоступна в моем приложении (в контроллерах, моделях, представлениях, ...).Итак, как мне это сделать?


Я видел этот ответ , это способ сделать то, что мне нужно, но я хотел бы иметь@account переменная "напрямую доступна".То есть без использования этого способа, но сделав его доступным, например, в моих представлениях, например:

<%= debug @account %>

Ответы [ 4 ]

21 голосов
/ 10 августа 2011

Вы можете использовать 'env' для этого. Итак, в вашем промежуточном программном обеспечении вы делаете это:

def call(env)
  env['account'] = Account.find(1)
  @app.call(env)
end

Вы можете получить значение, используя «запрос» в вашем приложении:

request.env['account']

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

2 голосов
/ 04 марта 2011

Я не знаю, можно ли это сделать с помощью Middelware.Мое предложение будет следующим:

class ApplicationController < ActionController::Base

  protect_from_forgery

  before_filter :set_my_var

private
  def set_my_var
    @account ||= Account.find(1)
  end

end

Таким образом, все ваши контроллеры и представления имеют доступ к @account

0 голосов
/ 05 августа 2011

Вы пытались создать глобальную переменную Ruby?

def call(env)
  $account ||= Account.find(1)

  @app.call(env)
end

и

<%= debug $account %>
0 голосов
/ 04 марта 2011

Вы можете использовать cattr_accessor: my_var в любой модели и установить эту переменную из промежуточного программного обеспечения с помощью

  MyModel.my_var = 'something'

И вы можете получить к ней доступ в любом месте приложения.

...