Rails — передача параметров в redirect_to — является ли сессия единственным способом?

#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 метода.