로그인 후 레일의 세션 해시를 통해 사용자를 원하는 URL로 리디렉션합니다.

3962 단어 rails
Rails 앱 내에서 이전에 했던 것처럼 애플리케이션의 특정 페이지에 액세스하기 전에 사용자가 로그인해야 하는 것은 매우 일반적인 작업입니다. 일반적으로 컨트롤러 내부에서 이전 작업으로 실행되는 메서드가 있습니다.

따라서 사용자가 앱을 방문하여 자신의 프로필 페이지에 액세스하려고 하면 먼저 로그인하지 않았기 때문에 로그인 페이지로 이동하고 먼저 로그인해야 한다고 정중하게 안내합니다. 여기 꽤 표준적인 것들.

그러나 로그인 후 사용자를 리디렉션하는 위치에 따라 로그인 화면으로 전송되기 전에 사용자가 처음에 가려고 했던 위치와 일치하지 않습니다.

이 경우를 이미지로 예를 들어 블로깅 애플리케이션이 있고 사용자가 앱을 방문하고 즉시 자신이 작성한 블로그 게시물을 편집하려고 시도합니다. 아마도 친구가 오타를 지적하고 오타를 해결하기를 원할 것입니다. 따라서 사용자는 처음에 특정 게시물 페이지로 이동하여 편집 버튼을 클릭하여 게시물을 편집할 수 있도록 설정했습니다.

그러나 사용자는 로그인을 요구해야 하는 이전 작업의 결과로 로그인 화면으로 리디렉션됩니다. 사용자는 성공적으로 로그인했지만 사용자가 원래 가고 싶었던 곳이 아닌 프로필 페이지로 라우팅됩니다. . 특정 게시물 페이지의 원래 대상으로 돌아가도록 사용자에게 도움의 손길을 제공할 수 있는 방법은 무엇입니까?

우리의 좋은 친구 세션 해시가 우리를 도왔습니다! 사용자가 응용 프로그램을 탐색할 때 전달되는 요청 개체를 사용하여 사용자가 이동하려고 시도한 의도된 URL을 가져오도록 로그인 요구 메서드를 수정할 수 있습니다. 그런 다음 요청 객체에서 url 속성을 가져와 나중에 사용할 수 있도록 세션 해시 내부에 저장할 수 있습니다. 따라서 로그인 요구 방법은 다음과 같을 수 있습니다.

  def require_signin
    unless current_user
      session[:intended_url] = request.url
      redirect_to new_session_url, alert: "Please sign in first!"
    end
  end


여기서 우리는 현재 사용자가 없는 한 해당 URL을 세션 해시에 저장하고 사용자를 로그인 페이지로 리디렉션하려고 합니다.

이제 사용자가 로그인한 후 세션 해시의 :intended_url 속성을 사용할 수 있습니다. 사용자가 원래 가고자 했던 곳으로 돌아가도록 하기 위해 존재하는 경우입니다. 다음과 같이 보일 수 있습니다.

    def create
        if user = User.authenticate(params[:email_or_username], params[:password])
            session[:user_id] = user.id
            flash[:notice] = "Welcome back, #{user.name}!"
            redirect_to(session[:intended_url] || user)
            session[:intended_url] = nil
        else
            flash.now[:alert] = "Invalid email/password combination!"
            render :new
        end
    end


여기에 약간의 작업이 있지만 중요한 줄은 create 작업 내부의 네 번째 줄입니다. 여기서 발생하는 일은 성공적으로 인증된 후 해당 속성이 설정된 경우 사용자가 의도한 URL로 리디렉션되거나 대신 프로필 페이지로 리디렉션된다는 것입니다.

임무 완수!

해피 루비잉!!!

좋은 웹페이지 즐겨찾기