#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 именно по этой причине. Создайте метод в вашем прикладном контроллере, который возвращает все, что вам нужно, а затем вы можете получить к нему доступ в любом из ваших других контроллеров.