Ошибка перенаправления при входе пользователя - PullRequest
0 голосов
/ 09 июня 2011

У меня есть приложение rails. Я создал sessioncontroller и хочу перенаправить на страницу пользователя «/ users», как только пользователь войдет в систему. Но перенаправление, похоже, не происходит.

class SessionsController < ApplicationController

  def create
     user = User.find_or_create_by_fbid(params[:user][:fbid]) #...Success
     user.update_attributes(params[:user])  #....Sucess
     sign_in(user)  # ....This occurs successfully 
     redirect_to users_path # .... Redirect doesnt occur on the browser side 
  end

end

Метод sign_in определен внутри Контроллера приложений

class ApplicationController < ActionController::Base

  def sign_in(user)
    session[:fbid] = user.fbid
    @current_user = user
  end

end

Журналы сервера ниже. Перенаправление на самом деле, кажется, происходит на стороне сервера. Но я не вижу никаких изменений на стороне клиента. Браузер не меняет страницу.

Server Logs

UsersController

class UsersController < ApplicationController

  def index

    @users = User.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @users }
    end
  end

  end

Оригинальная почта Ajax -

$.post("/sessions",{user:{name:profile.name, email:profile.email,fbid:profile.id}}); 

Перенаправление происходит успешно, если я использую оператор перенаправления javascript внутри $ post () в качестве функции обратного вызова.

$.post("/sessions",{user:{name:profile.name, email:profile.email,fbid:profile.id}},function( data ) {
          window.location="/users";
      }
    );

Ответы [ 2 ]

1 голос
/ 09 июня 2011

Вам необходимо обработать перенаправление ответа в ajax-запросе. Обычно браузер обрабатывает, но это не с AJAX.

Из этого ТАКОГО вопроса (слегка отредактировано для вашего случая)

var params = {user:{name:profile.name, email:profile.email,fbid:profile.id}};
$.ajax({
type: "POST",
url: "/sessions",
data: params,
dataType: "json",
success: function(data, textStatus) {
    if (data.redirect) {
        // data.redirect contains the string URL to redirect to
        window.location.href = data.redirect;
    }
    else {
        // data.form contains the HTML for the replacement form
        $("#login_form").replaceWith(data.form);
    }
}

});

0 голосов
/ 09 июня 2011

Я использую настоящую базовую аутентификацию на основе скринкаста Райана Бейтса.Если вы не можете понять это из моего кода, я рекомендую посмотреть Аутентификация с нуля

Applications_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery
  helper_method :current_user

  private

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
end

session_controller.eb

class SessionsController < ApplicationController
  def new
  end

  def create
    user = User.authenticate(params[:email], params[:password])
    if user
      session[:user_id] = user.id
      redirect_to root_url, :notice => "Logged in!"
    else
      flash.now.alert = "Invalid email or password"
      render "new"
    end
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url, :notice => "Logged out!"
  end
end

Ajax Post -

$.post("/sessions",{user:{name:profile.name, email:profile.email,fbid:profile.id}}); 
...