Как мне сохранить тот же контроллер и действие в URL страницы при повторном рендеринге действия в Rails? - PullRequest
1 голос
/ 05 декабря 2010

Я использую AuthLogic для аутентификации пользователей в моем приложении rails.Эта часть настроена и работает правильно.

У меня определен следующий маршрут:

map.login '/account/login', :controller => :user_sessions, :action => :new

Вызов маршрутов рейка возвращает то, что я ожидаю:

login /account/login {:controller=>"user_sessions", :action=>"new"}

Когда кто-тоотправляет логин, вызывает UserSessionsController.create:

def create
    @user_session = UserSession.new(params[:user_session])
    if @user_session.save
        flash[:notice] = "Login successful!"
        redirect_back_or_default account_url
    else
        render :action => :new
    end
end

Если сбой @ user_session.save, на экране появляются соответствующие сообщения об ошибках.Однако URL-адрес браузера также меняется на «http://localhost:3000/user_session" вместо того, чтобы оставаться на» http://localhost:3000/account/login".

Я предполагаю, что проблема заключается в том, что я передаю методу рендеринга.Что я должен кормить его?

Ответы [ 3 ]

2 голосов
/ 05 декабря 2010

Это на самом деле предполагаемое поведение для этого процесса. В стандартном скаффолдинговом контроллере RESTful ошибка проверки в действиях create и update просто отобразит исходный шаблон без перенаправления. Это приводит к тому, что вы видите - шаблон new будет отображаться с URL-адресом действия create в строке URL-адреса. Причина этого заключается в том, что для отображения информации пользователю о том, какие ошибки произошли, представление должно иметь доступ к недопустимому объекту модели, который в вашем случае равен @user_session.

Вы можете использовать redirect_to вместо render, если хотите принудительно перенаправить на исходный URL, но это приведет к потере информации об ошибках. Вам нужно будет вручную сохранить ошибки в сеансе, что будет грязно. Мой совет не беспокоиться о том, что URL не совпадает с оригиналом, так как это довольно стандартно во всех приложениях Rails.

1 голос
/ 13 мая 2014

Просто добавляем решение для Rails 4 (основываясь на ответе Шона здесь):

Добавить новый маршрут к файлу маршрутов:

post '/ carts / new' => 'carts # create', как:: create_post

Добавить URL: create_post_path к тегу формы

Готово.

0 голосов
/ 11 декабря 2010

После дальнейшего поиска я нашел решение в другом вопросе StackOverflow: Использовать пользовательский маршрут при сбое проверки модели

Я просто изменил свои маршруты, чтобы добавить новый для позирования в '/ account / login':

map.login '/account/login', :controller => :user_sessions, :action => :new, :conditions => {:method => :get}
map.login_post '/account/login', :controller => :user_sessions, :action => :create, :conditions => {:method => :post}

Затем я обновил свой вид, чтобы использовать новый маршрут:

<% form_for @user_session, :url => login_post_path do |f| %>

Это работает отлично. Неудачный вход в систему выдает соответствующие сообщения об ошибках и поддерживает URL / account / login.

...