Глобальная переменная Ruby on rails?

#ruby-on-rails #ruby #ruby-on-rails-3

#ruby-on-rails #ruby #ruby-on-rails-3

Вопрос:

Я пытаюсь установить для текущего пользователя переменную, чтобы на каждой странице отображалось «Вошел как Джо». Не совсем уверен, с чего начать…

Есть какие-нибудь быстрые советы? В частности, в какой файл должно быть помещено что-то подобное…

Мой текущий пользователь может быть определен как (я думаю): User.find_by_id(session[:user_id])

TY 🙂

Ответ №1:

Возможно, вы захотите использовать что-то вроде Authlogic или Devise для обработки этого, а не внедрять собственную систему аутентификации, особенно если вы не очень знакомы с шаблонами проектирования, распространенными в приложениях Rails.

Тем не менее, если вы хотите сделать то, что вы задаете в вопросе, вам, вероятно, следует определить метод в вашем ApplicationController следующим образом:

 def current_user
  @current_user ||= User.limit(1).where('id = ?', session[:user_id])
end
  

Вы наследуете от своего ApplicationController все свои обычные контроллеры, поэтому все они имеют доступ к current_user методу. Кроме того, вам может понадобиться доступ к методу в качестве вспомогательного средства в ваших представлениях. Rails тоже позаботится об этом (также в вашем ApplicationController):

 helper_method :current_user
def current_user ...
  

Примечание: Если вы используете методы find_by_x, они вызовут ошибку ActiveRecord::RecordNotFound, если ничего не будет возвращено. Вы, вероятно, этого не хотите, но вам может понадобиться что-то, что не позволит пользователям получать доступ только к пользовательским ресурсам, и, опять же, Rails вас предусмотрел:

 class ApplicationController < ActionController::Base
  protect_from_forgery
  helper_method :current_user
  before_filter :require_user

private
  def current_user
    @current_user ||= User.limit(1).where('id = ?', session[:user_id])
  end

  def require_user
    unless current_user
      flash[:notice] = "You must be logged in to access this page"
      redirect_to new_session_url
      return false
    end
  end
end
  

Приветствия!

Ответ №2:

Она принадлежит вашим контроллерам.

Комментарии:

1. есть ли одна глобальная переменная, которую я могу установить один раз, или мне нужно установить это в каждом из моих контроллеров?

2. masedesign: Если вы определяете переменную в разных местах, это не глобальная переменная. Поскольку все ваши другие контроллеры наследуются от вашего ApplicationController , вы можете определить переменную класса в ApplicationController (что-то вроде @@foo = 42 ), а затем прочитать ее и установить в других контроллерах. Это не будет глобальная переменная, но если это необходимо только контроллерам, достаточно близко.

Ответ №3:

Все ваши контроллеры унаследованы от Application Controller именно по этой причине. Создайте метод в вашем прикладном контроллере, который возвращает все, что вам нужно, а затем вы можете получить к нему доступ в любом из ваших других контроллеров.