#ruby-on-rails
#ruby-on-rails
Вопрос:
У меня установлен контроллер в качестве корневого каталога моего приложения. Он принимает параметр с именем uid и проверяет, существует ли пользователь. Если нет, я хочу, чтобы он перенаправил на новую страницу пользователя и предварительно заполнил поле uid идентификатором uid в параметре.
В моем root_controller:
def index
if params[:uid]
@user = User.find_by_uid(params[:uid])
if (!@user.blank?)
# do some stuff
else
session[:user_id] = params[:uid]
redirect_to(new_user_path, :notice => 'Please register as a new user')
end
else
# error handling
end
end
В моем users_controller ПОЛУЧИТЕ / users/новое действие:
def new
@user = User.new
@user.uid = session[:user_id]
# standard respond_to stuff here
end
Все это работает нормально, но является ли это приемлемым способом сделать это? Изначально я пытался передать uid в инструкции redirect, например:
redirect_to(new_user_path, :notice => 'Please register as a new user', :uid => params[:uid])
или даже тестирование его с:
redirect_to(new_user_path, :notice => 'Please register as a new user', :uid => 'ABCD')
но, похоже, ни один из них не передал значение users_controller…Я не смог получить к нему доступ, используя params[:uid] с этого контроллера.
Является ли сеанс подходящим местом для хранения подобных материалов, или есть лучший способ передать их через перенаправление? Спасибо!
Ответ №1:
Сеанс подходит для хранения такого рода информации. В зависимости от того, что вы делаете с uid
, на самом деле может быть опасно разрешать чтение с URL. Представьте, что конечный пользователь был злонамеренным и начал вводить туда идентификаторы другого пользователя.
Для сообщений, которые должны длиться только до следующего запроса, Rails фактически имеет flash
объект, который перенесет его для вас.
http://guides.rubyonrails.org/action_controller_overview.html#the-flash
Тем не менее, если вы хотите перенаправить на URL-адрес и передать некоторые параметры, сделайте это следующим образом:
redirect_to(new_user_path(:notice => 'Please register as a new user', :uid => 'ABCD'))
Параметры, которые вы хотите передать, являются аргументами new_user_path
метода, а не самого redirect_to
метода.