2012-08-14 4 views
1

다음과 같이 세션 컨트롤러가 있습니다 : new, : create 및 : delete 작업.게시가 실패 할 때 레일이 컨트롤러 부분을 변경하지 못하도록하십시오.

def controller_for(path) 
    Rails.application.routes.recognize_path(path)[:controller] 
end 

일반적으로는,이 방법은 잘 작동하지만 잘못된 로그인 세부 사항을 가진 사용자가 방문 /login 및 징후 인이 다음 레일 경우 /sessions에 URL을 변경하고 렌더링 : 나는 또한 현재 페이지 컨트롤러를 확인하는 방법이

>> r = Rails.application.routes 
>> r.recognize_path "/sessions" 
=> {:controller=>"sessions", :action=>"index"} 
: 포인트 내 방법은 위의 arror를 throw되는 :new 동작은

No route matches "/sessions" 

recognize_path이 작업을 수행하려고하는 것 같다

색인 작업이 없으므로 오류가 발생합니다. 내가 정말 원하는 것은 이것이다 :

>> r.recognize_path "/login" 
=> {:controller=>"sessions", :action=>"new"} 

그래서 로그인이 대신 /sessions로 변경 실패 할 때 내가 /login로 URL을 유지하기 위해 레일을 강제 할 수있는 방법?

답변

2

문제는 평온한 경로를 사용하고 있다는 것입니다. 로그인 양식을 게시하면/세션에 게시하여 세션을 만들고있는 것입니다. 이것은 SessionsController#create입니다./login은 기본적으로/sessions/new의 별명 인 SessionsController#new으로 전송되는 별개의 맞춤적이고 비 안정적인 경로입니다.

recognize_path은 환경에서 달리 지정하지 않을 경우 경로를 GET 요청으로 해석하는 것이 기본값입니다. 그리고 GET 요청은 인덱스보기를 의미하는 것으로 /sessions으로 가정합니다.

# The recognize_path method in the Rails source: 
def recognize_path(path, environment = {}) 
    method = (environment[:method] || "GET").to_s.upcase 
    ... 
end 

'수정'하는 한 가지 방법은 라우팅을 변경하는 것입니다.

match "/process_login" => "sessions#create", :as => 'process_login' 

을 그리고 일치하도록 로그인 폼을 변경 : 예를 들어, 당신이 당신의 루트하기 위해 추가 할 수

<% form_tag process_login_path do %> 
    [your login form here] 
<% end -%> 

지금 대신/세션/process_login에 양식을 게시 할 것이고, 경로는 인식기에 의해 올바르게 해석되어야합니다.

+0

감사합니다. 누군가가 이것을 대답했음을 알았습니다. 좋은 정보가 있습니다. 지금은 이해합니다. – stephenmurdoch

+1

다행 이었기 때문에 기뻤습니다. 내 Stack 응답을 때때로 잃어 버린다.) –

관련 문제