Получение рендеров для распознавания пользовательских путей маршрутизации - PullRequest
5 голосов
/ 24 октября 2008

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

# 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?

Ответы [ 2 ]

7 голосов
/ 24 октября 2008

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

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

 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}

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

0 голосов
/ 24 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...