2009-05-01 1 views
12

레일의 map.resources에 의해 생성되는 모든 기본 경로를 좋아합니다. 하지만, 내 경로에서 숫자가 아닌 식별자를 사용하고자하는 경우가 있습니다. 중첩 된 경로는 사용자와 사용자의 기사로 구성되어있는 경우 예를 들어, 표준 경로는 같은 작성할 수 :Rails의 map.resources()에서 기본 식별자 param "id"의 이름을 바꾸는 방법은 무엇입니까?

map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id' 

그러나, 많은 장점/이유가 없습니다에 사용 레일에 의해 생성 된 기본 숫자 식별자가 있습니다. 기본 : id 매개 변수를 모든 표준 작업에 대한 사용자 지정 경로를 작성하지 않고 다른 정식 식별자로 대체 할 수 있습니까? 달성 map.resources를 사용하여 경로의 이런 종류의

'/users/:login/articles/:id' 

이다 : 나는 다음과 같은 형식의 경로를 원한다면 말?

+0

p.s. 나는 Merb의 라우팅 시스템이이 기능을 가지고 있기 때문에 이것을 주로 요구합니다. – newtonapple

답변

13

Rails 2.3부터는 매개 변수 이름을 변경하지 않고 #resources이 제공하는 자동 라우팅을 계속 사용할 수 없습니다. 당신이 :path_prefix:name_prefixarticles을지도 할 수있는 해결 방법으로

:

map.resources :articles, :path_prefix => "https://stackoverflow.com/users/:login", 
         :name_prefix => "user_" 

:path_prefix는 URL에 영향을, 그리고 당신이이 노선하게 될 겁니다 있도록 :name_prefix는 생성 된 이름 경로에 영향을 미칩니다

user_articles GET /users/:login/articles(.:format)   {:controller=>"articles", :action=>"index"} 
        POST /users/:login/articles(.:format)   {:controller=>"articles", :action=>"create"} 
new_user_article GET /users/:login/articles/new(.:format)  {:controller=>"articles", :action=>"new"} 
edit_user_article GET /users/:login/articles/:id/edit(.:format) {:controller=>"articles", :action=>"edit"} 
    user_article GET /users/:login/articles/:id(.:format)  {:controller=>"articles", :action=>"show"} 
        PUT /users/:login/articles/:id(.:format)  {:controller=>"articles", :action=>"update"} 
        DELETE /users/:login/articles/:id(.:format)  {:controller=>"articles", :action=>"destroy"} 

일반적인 규칙의 - 엄지 손가락으로하지만, 나는 당신이 당신의 질문에 게시 라우팅과, :user_id의 레일 기본 ​​규칙으로 다루고 싶어요. :id:user_id은 반드시 "숫자 식별자"를 의미하지 않는다는 것을 일반적으로 이해합니다. 이는 "리소스 식별자"를 의미합니다. 그리고 기본 규칙을 고수함으로써 Rails에서 자원 경로를 사용하는 모든 사람이 코드를 이해하기 쉬워집니다.

자원에 숫자가 아닌 식별자를 사용하려면 모델에서 #to_param을 다시 정의하기 만하면됩니다. 그런 다음 컨트롤러에서 숫자 ID 대신이 식별자 (예 : User#find_by_login!)를 찾을 수있는 파인더를 사용해야합니다.

+0

+1 : 매우 잘 쓰여진 답변입니다. –

11

모델에서 to_param을 재정 의하여 URL에서 ID를 사용하여 기본값을 변경할 수 있습니다. 예 :

class User < ActiveRecord::Base 
    def to_param 
    login 
    end 
end 

user_articles_path(@user) => "https://stackoverflow.com/users/:login/articles" 

당신이 확인해야합니다 유일한 다른 변화는 로그인하여보다는 당신의 컨트롤러에서 ID로 사용자를 찾을 수 있습니다.

+0

to_param은 경로 생성을 시도합니다. 그러나 인식에서 여전히 그것을 user_id로 전달합니다. 이름을 바꿀 거리가 있습니까? 로그인 하시겠습니까? – newtonapple

+0

그것은 다른 질문에 대한 잘 쓰여진 답변입니다 :/여기 라우터와': id' 경로 매개 변수의 이름을 바꾸는 방법에 대한 질문입니다. – Matchu

관련 문제