将 friendly_id 添加到用户模型后登录后友好转发不起作用

Friendly forwarding after login doesn't work after adding friendly_id to the user model

我的应用程序的核心是从 Michael Hartl's rails tutorial 构建的。最近我更改了用户数据库,因此 name 列被命名为 username 并且我还添加了 friendly_id 以获得更漂亮的 URL。我根据这些更改更新了我能找到的所有地方,除了用户登录后的友好转发外,一切都运行顺利。例如如果未登录的用户访问用户编辑页面,他们将被带到登录页面,在他们登录后,他们应该被带到他们的编辑页面。但它只是让他们登录并停留在登录页面上。

我看不到任何需要更改的地方,所以它又可以工作了,据我所知它应该可以工作

会话控制器

 def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      log_in user
      params[:session][:remember_me] == '1' ? remember(user) : forget(user)
      redirect_back_or user
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
  end

用户控制器

 before_action :correct_user,   only: [:edit, :update]
 before_action :logged_in_user, only: [:edit, :update]

 def edit
 end

private


    # Confirms a logged-in user.
    def logged_in_user
      unless logged_in?
        store_location
        flash[:danger] = "Please log in."
        redirect_to login_url
      end
    end


    def correct_user
      @user = User.friendly.find(params[:id])
      redirect_to(root_url) unless current_user?(@user)
    end

应用程序控制器

def redirect_back_or(path)
  redirect_to request.referer || path
end



  private

    # Confirms a logged-in user.
    def logged_in_user
      unless logged_in?
        store_location
        flash[:danger] = "You gotta login first!"
        redirect_to login_url
      end
    end

会话助手

  # Redirects to stored location (or to the default).
  def redirect_back_or(default)
    redirect_to(session[:forwarding_url] || default)
    session.delete(:forwarding_url)
  end

  # Stores the URL trying to be accessed.
  def store_location
    session[:forwarding_url] = request.url if request.get?
  end

有人知道问题出在哪里吗?

更新

在与@vishal 聊天后,重定向是从应用程序控制器redirect_back_or 方法

完成的
 def redirect_back_or(path)
  redirect_to request.referer || path
 end 

如果我把它改成

def redirect_back_or(path)
  redirect_to root_path || path
end

我被带到了根路径,所以我知道这行 os most 可能是罪魁祸首。

在工作和不工作之间,我为私人消息添加了邮箱 gem,将用户数据库 name 更改为 username,并将 friendly_id 添加到username 列。也许其中的某些事情可能会引起您的注意,因为它会停止工作。

在您的应用程序控制器中,将 redirect_back_or(path) 方法更改为此。

    def redirect_back_or(path)
      redirect_to session[:forwarding_url] || path
      session.delete(:forwarding_url)
    end

您之前有 redirect_to request.referer,它负责将您重定向到最后一个 url,即 login_url。

我不知道您为什么要定义两种不同的方法 - 1 个在 ApplicationController 中,1 个在 SessionsHelper 中 - 虽然名称相同但预期行为不同。