Получение рендеров для распознавания пользовательских путей маршрутизации

StackOverflow https://stackoverflow.com/questions/231538

  •  04-07-2019
  •  | 
  •  

Вопрос

Итак, у меня есть шикарный собственный маршрут для входа в систему

# routes.rb
map.login '/login', :controller => 'sessions', :action => 'new'

Посетите www.asite.com/login и вы там. Однако, как обычно при неудачной регистрации, мы сделаем следующее в нашем действии. Обратите внимание, что происходит при неудачной регистрации.

 # sessions_controller.rb

 def create
   self.current_user = User.authenticate(params[:email], params[:password])
   if logged_in?
     # some work and redirect the user
   else
     flash.now[:warning] = "The email and/or password you entered is invalid."
     render :action => 'new'
   end
 end

Это очень типично. Просто отобразите новое действие и снова введите логин. К сожалению, вы также получаете с этим ужасный URL: www.asite.com/session. Ик! Можно ли заставить рендеринг соответствовать исходному URL?

Нет правильного решения

Другие советы

Ваша проблема заключается в следующем: пользователь сначала посещает / login и заполняет форму. Когда они отправляют форму, они отправляют сообщение в / session , поэтому URL браузера изменяется. Чтобы обойти это, вы можете сделать две вещи:

Как упоминал Майкл, вы можете перенаправить обратно на: новое действие, изменив else на:

 else
   flash[:warning] = "The email and/or password you entered is invalid."
   redirect_to login_path
 end

Обратите внимание, что вам нужно изменить флэш-память, чтобы сообщение было доступно в следующем запросе (после перенаправления).

Второй способ немного более хакерский, но, возможно, стоит упомянуть. Используя условия на ваших маршрутах, вы можете сопоставить как форму входа (которая является GET), так и форму отправки (которая является POST) по одному и тому же пути. Что-то вроде:

map.login '/login',
  :controller => 'sessions', :action => 'new', 
  :conditions => {:method => :get}

map.login_submit '/login',
  :controller => 'sessions', :action => 'create', 
  :conditions => {:method => :post}

Тогда, если ваше действие формы - это путь входа в систему, все должно работать так, как вы ожидаете.

Изменить render: action = > 'new' в redirect_to login_path

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top