2009-10-14 2 views
1

레일스에 이와 비슷한 사이트 (일반 Q & A 사이트)가 있고이 "요청"페이지가 사용자에게 첫 번째 페이지로 표시되기를 원한다고 가정 해 봅니다. 그가 로그인하지 않더라도 본다. 그는 질문을하고, '새로운'방법으로 로그인하지 않았는지 확인하고/session/new로 반송한다. 여기서/login/new 계정으로 로그인하거나 새 계정을 만들 수있다. 문제는, 내가이 과정을 통해 처음에 물었던 그 질문을 어떻게 보존 할 것인가? (그리고 그 최선의 방법은 무엇인가?)Rails에서 로그인/등록을 통한 양식 제출 유지

답변

0

세션에서 유지하십시오. 따라서 로그인 한 후 사용자가 질문에 다시 들어가면 이미 세션 중에 어떤 것이 있음을 알 수 있습니다.
그리고 직접 표시 할 수 있습니다.

+0

데이터가 너무 커서 쿠키에 저장할 수없고 쿠키를 세션 저장소로 사용하는 경우 실패합니다. – Mohamad

+0

글쎄, 항상 ID를 저장하고 데이터베이스에 실제 데이터를 보관할 수 있습니다. 그러나 데이터베이스를 세션 저장소로 저장하는 것이 더 효율적입니다. 기본적으로 이것이 쿠키 이외의 세션 저장소를 사용하는 이유입니다. –

1

내가

  1. 사용자가
  2. 사용자가 페이지에 로그인 할 때 리디렉션되는 양식이 제공되는이
  3. 사용자가 제출 될 수있는 질문에 설명 된 작업의 흐름을 이해하고있어이 다시 리디렉션
  4. 사용자가 마지막으로 자신의 양식을 제출 (질문이 단계를 수행하는 방법을 묻는) 부하에
  5. 다시 채 웁니다 양식에 성공 로그에 형성한다. 생략 2-4 단계와

사용자는 미안 해요

. 로그인,하지만 난 더 레일 질문보다 기본 UI 문제의 증상으로 질문을 참조하는 경우. 질문 만 게시 할 수있는 사용자로 로그인 한 경우

, 왜 텍스트 상자를 표시? 사용자가 어떤 식 으로든 로그인하려면 먼저 방해가되지 않도록하십시오. 보다 나은 해결책은 로그인과 양식을 통합하는 것입니다. 뷰에서이 같은

뭔가 :

<% form_for :question do |form| %> 
    <% unless logged_in? %> 
    <% fields_for :session do |session_form|%> 
     <%= session_form.label :login %> 
     <%= session_form.text_field :login %> 
     <%= session_form.label :password %> 
     <%= session_form.password_field :password %> 
    <%end%> 
    <%end%> 
    <%= form.text_area :question %> 
<%end%> 

그리고 컨트롤러의

def new 
    ... 
    unless params[:session].nil? 
    self.current_user = User.authenticate(params[:session][:login], params[:session][:password]) 
    end 
    if logged_in? 
    flash[:notice] = "Logged in successfully" 
    else 
    flash[:error] = "Incorrect username and or password." 
    end 
    if logged_in? && @question.save 
    .... process successful entry 
    else 
    ... process unsuccessful entry 
    end 
end 

편집 : 모하마드의 여러 컨트롤러와 형태에서이 패턴을 재사용의 문제를 발생시킵니다. 그래서이 패턴의 재사용을 해결하기위한 대답이 업데이트되었습니다.

은 당신이 그것을 필요로 작업의 before_filter에서 참조하는 도우미 함수에이 블록을 넣을 수있는, 재사용이 간단합니다.

def login 
    unless params[:session].nil? 
    self.current_user = User.authenticate(params[:session][:login], params[:session][:password]) 
    if logged_in? 
     flash[:notice] = "Logged in successfully" 
    else 
     flash[:error] = "Incorrect username and or password." 
    end 
    end 
end 

같이 : 뷰 측면

before_filter :login => :only [:new , :edit, :update, :delete] 

, 그 세션 파라미터를 매립 form_for의 새로운 변형 예를 구성도 어렵지 않을 것이다. 어쩌면 form_for_with_session?

는 실패 응답 처리에 관해서는, 나는 코드 블록을 취 도우미 함수를 제안합니다. 죄송합니다. 필자에게 편지를 쓰거나 테스트 할 시간이 없습니다.사용자 생성 및 인증 물건이 모든 로그인 조치를 완료 한 후

+0

여러 컨트롤러에서이 동작을 반복해야하는 경우 어떻게해야합니까? 이것을 모든 행동에 추가해야하는 번거 로움이 있습니다. 그러한 시나리오를 해결하기 위해 사용할 수있는 다른 솔루션은 무엇입니까? – Mohamad

+0

코드를 재사용 할 수 있도록 답변을 업데이트했습니다. – EmFi

+0

고마워요. +1 이상의 가치가 있습니다! 건배! – Mohamad

0
def create 
    if current_user # Implement this method in your auth framework 
    @question = Question.new(params[:question] || session.delete[:question]) 
    # (the usual stuff you'd do to save) 
    else 
    session[:question] = params[:question] 
    redirect_to :controller => :sessions, :action => "new" 
    end 
end 

그런 다음, 단지 session[:question]가 정의되어있는 경우 당신이 다시이 create 행동에 게시합니다.

+0

데이터가 쿠키에 맞지 않으면 어떻게합니까? – Mohamad