Получение рендеров для распознавания пользовательских путей маршрутизации
-
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