Ruby on Rails - переменная контроллера доступа от модели
Я пытаюсь получить доступ к переменной экземпляра, которая установлена в контроллере в модели. Контроллер - это контроллер продуктов, а модель - модель продукта. Переменная экземпляра - это экземпляр другой модели, называемой учетной записью.
Переменная экземпляра @current_account
Когда я запускаю код, ничего не происходит, я не получаю сообщение об ошибке. Кто-нибудь знает, где я могу найти что-то прочитанное о переменных экземпляра доступа, установленных в контроллере из модели?
Спасибо
Eef
Ответы
Ответ 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
Я не уверен, правильно ли я понял вопрос, но я задержу удар.
Я думаю, что если вам нужно получить доступ к переменной экземпляра контроллера из модели, вам нужно либо сделать ее атрибутом в модели, либо переместить вашу логику на другой контроллер класса, а не на модель.