2010-04-13 2 views
2

더 안전하고 의미있는 URL을 사용하여 사용자 및 프로필을 편집하기위한 URL을 숨기고 싶습니다. 예를 들어, /user/13/edit/settings/account이고 /user/13/profile/edit/settings/profile이되어야합니다.레일 : 원하지 않는 URL 이용으로 404를 생성하거나 리디렉션하는 방법?

나는 그걸 달성 할 수 있었지만, 그 때문에 나는 세션에서 current_user 비트의 사용자 정보를로드해야했다. 그래서 같이 : 나는 세션에서 current_user으로 params에서 @user.id을 비교할 수 없기 때문에 지금

# users_controller 
def edit 
    @user = current_user 
end 

# profiles_controller 
def edit 
    @user = current_user 
    @profile = @user.profile 
end 

하지만, 어떻게 악용되는 기존의 URL을 (/user/13/edit/user/13/profile/edit)를 중지 할 수 있습니까? 그들은 항상 현재 사용자의 양식을로드하므로 해를 끼치 지 않지만 404 오류 또는 그 이상을 생성 한 경우 더 편할 것입니다.

미리 감사드립니다.

답변

1

먼저 인증 메커니즘이 현재 사용자를 설정해야합니다.

routes.rb

map.account '/settings/account', :controller => 'user', :action => 'edit' 
map.profile '/settings/profile', :controller => 'user', :action => 'edit_profile' 

map.resources :users, :only => [:edit, :update, :show], 
       :member => { :edit_profile => :get, :update_profile, :put } 

이 다음과 같은 경로 생성 : 분명히

before_filter :redirect_if_unauthorized 

def edit 
    @user = current_user 
end 

# profiles_controller 
def edit 
    @user = current_user 
    @profile = @user.profile 
end 

protected 

def redirect_if_unauthorized 
    redirect_to some_path if params[:id] or current_user.nil? 
end 

이 some_path 존재하지 않는, 당신은 페이지를 만들어야합니다

/settings/account   (get) 
/settings/profile   (get) 
/users/:id    (get, put) 
/users/:id/edit   (get) 
/users/:id/edit_profile (get) 
/users/:id/update_profile (put) 

users_controller.rb을/경로 등을 사용하여 오류를 표시합니다.

이 솔루션을 사용하면 params [: id]를 기반으로 사용자를 표시하거나 조작 할 수 없으며 인증 체계에 의해 저장된 current_user 만 표시됩니다.


I 수도 난 당신이 당신의 routes.rb 파일에 map.resources을 장담하기 때문에도 (GithubRailscast을)를 declarative_authorization 보석/플러그인을보고

+0

내 문제는 정확하게 새 URL이 비교를 위해 사용할 수있는 매개 변수를 제공하지 않는다는 것입니다. –

+0

몇 가지 사항을 수정했는데 찾고있는 것과 더 가깝습니까? –

+0

솔루션을 제 코드에 적용하려고 시도했지만 작동하지 못했습니다. 이제 플러그인을 살펴 보겠습니다. 도와 줘서 고맙다. –

0

은/편집 URL은 여전히 ​​존재 제안 사용자 모델 용. routes.rb 파일에있는 라인보다 더 높은 라인을 배치 할 수 있습니다.이 라인은 경로를 바꾸려는 편집 라인과 명시 적으로 일치하며, 원하는 곳 어디든지 지정할 수 있습니다.