Подтвердить что ты не робот

Ruby on Rails - переменная контроллера доступа от модели

Я пытаюсь получить доступ к переменной экземпляра, которая установлена ​​в контроллере в модели. Контроллер - это контроллер продуктов, а модель - модель продукта. Переменная экземпляра - это экземпляр другой модели, называемой учетной записью.

Переменная экземпляра @current_account

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

Спасибо

Eef

4b9b3361

Ответ 1

Обычно вы не должны пытаться получить доступ к контроллеру из модели для сообразительных проблем, в которые я не буду входить.

Я решил аналогичную проблему:

class Account < ActiveRecord::Base
  cattr_accessor :current
end

class ApplicationController < ActionController::Base
  before_filter :set_current_account
  def set_current_account
    #  set @current_account from session data here
    Account.current = @current_account
  end
end

Затем просто войдите в текущую учетную запись с помощью Account.current

Ответ 2

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Следующий код нарушает соглашения MVC, которые говорят...

Использование атрибутов класса может, вероятно, привести к проблемам безопасности потоков. Я бы использовал Thread.current + around_filter, чтобы хранить данные, связанные с контроллером, на уровне нитей и обеспечивать его очистку незадолго до завершения запроса:

class ApplicationController < ActionController::Base

  around_filter :wrap_with_hack

  def wrap_with_hack
    # We could do this (greener solution): 
    # http://coderrr.wordpress.com/2008/04/10/lets-stop-polluting-the-threadcurrent-hash/
    # ... but for simplicity sake:
    Thread.current[:controller] = self
    begin
      yield
    ensure
     # Prevent cross request access if thread is reused later
     Thread.current[:controller] = nil
    end
  end
end

Теперь текущий экземпляр контроллера будет доступен в глобальном масштабе во время обработки запроса через Thread.current [: controller]

Ответ 3

Если вы нуждаетесь для доступа к переменной контроллера из модели, это обычно означает, что ваш дизайн неправильный, потому что контроллер служит мостом между представлением и моделью (по крайней мере, в Rails), контроллер получает информацию от моделей, модели не должны знать ничего о контроллерах, но если вы хотите это сделать, вы можете сделать это так же, как сказал гем, но я бы предпочел:

 class << self

    attr_accessor :current

 end

вместо

cattr_accessor :current

вы можете видеть, почему здесь = > cattr_accessor не работает так, как должно быть

Ответ 4

Я не могу комментировать напрямую, поэтому я опубликую здесь: принятый ответ кажется неправильным. Как отмечает @vise, переменные класса разделяются между запросами. Поэтому, если только только одна текущая учетная запись для всего приложения не будет вести себя так, как ожидалось.

Подробнее см. принятый ответ от @molf здесь: Является ли Rails shared-nothing или может отделить запросы к тем же переменным среды выполнения?

Ответ 5

Я не уверен, правильно ли я понял вопрос, но я задержу удар.

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