Приложение Rails 3 не перенаправляет после отправки формы AJAX - PullRequest
3 голосов
/ 23 февраля 2011

У меня есть форма авторизации Authlogic с :remote => true, которая выполняет небольшую встроенную проверку с помощью шаблона RJS, если имя пользователя / пароль недействительны. Это работает нормально, но когда учетные данные являются действительными, он не перенаправляется должным образом в другом месте.

Вот контроллер, который отвечает на ввод формы:

class UserSessionsController < ApplicationController
  respond_to :html, :js

  before_filter :require_no_user, :only => [:new, :create]
  before_filter :require_user, :only => :destroy

  def new
    @user_session = UserSession.new
  end

  def create
    @user_session = UserSession.new(params[:user_session])

    respond_to do |format|
      if @user_session.save     
        flash[:notice] = "Login successful!"
        format.html { redirect_to account_url }
      else
        format.js
      end
    end
  end

  def destroy
    current_user_session.destroy
    flash[:notice] = "Logout successful!"
    redirect_to root_path
  end

end

Часть format.js работает, но если пользователь / пароль хороши (format.html), ничего не происходит. Однако, если я посмотрю файл development.log, он будет запрашивать страницу account_url. Он просто не перенаправляет вас в браузер. Я думаю, что это возвращает страницу учетной записи через AJAX, и я действительно просто хочу нормальное перенаправление.

HTML-код формы такой:

<%= simple_form_for(
:user_session, @user_session, 
:url => { :controller => 'user_sessions', :action => "create" },
:html => { :id => 'login-dropdown' }, :remote => true) do |f| %>

Ответы [ 3 ]

8 голосов
/ 23 февраля 2011

Я нашел способ это исправить.В http://www.ruby -forum.com / topic / 168406 # 945053 я добавил следующее к своему контроллеру приложений:

def redirect_to(options = {}, response_status = {})
  if request.xhr?
    render(:update) {|page| page.redirect_to(options)}
  else
    super(options, response_status)
  end
end

Это предотвращает доставку ответа перенаправления через xhr.Если есть более «правильный» способ сделать это в контроллере, я бы хотел это услышать.

0 голосов
/ 21 сентября 2016
app
 views
   user_sessions
     create.js.erb(create file this)

в вашем действии создания добавьте этот код

 def create
  @user_session = UserSession.new(params[:user_session])

respond_to do |format|
  if @user_session.save     
    flash[:notice] = "Login successful!"
    @url = account_url
  end
 format.js
end

end

в ваш "create.js.erb"

window.location.replace(<%= @url %>);
0 голосов
/ 18 ноября 2011

Вы можете сделать, как показано ниже:

в allpication.js

$(document).ready(function(){
    $(document).ajaxError( function(e, xhr, options){
    if("401" == xhr.responseText)
    {
       $(location).attr('href','/users/sign_in');
    }
  });
}) 

, а метод контроллера имеет следующий код:

respond_to do |format|
    format.html {redirect_to @new_user_session_url}
    format.js { render :text=>'401' ,:status=>401}
end

Но я думаю, что есть лучший способ сделать это ...

...