2013-10-04 4 views
3

레일 경로를 사용하는 데 약간 혼란 스럽습니다. 내 URL을 맞춤 설정하는 방법에 대한 제안이 필요합니다.사용자 정의 레일 라우팅 URL

이 내 현재의 URL입니다

http://localhost:3000/posts/product/41?product_id=2

http://localhost:3000/posts/product/41?model_id=24&product_id=2

이 내 링크 URL을 먼저 와야

<%= link_to product_model.name, controller: :posts,action: :product,product_id: params[:product_id],model_id: product_model.id 

논리적 제품입니다. 그러나 왜 모델이 먼저 여기에서 선호됩니까?

와 나는 같은 내 URL 뭔가를 필요로이

http://localhost:3000/posts/product/41/mobile

http://localhost:3000/posts/product/41/mobile/nokia

나는 내 경로에 특별한 코드를 작성하지 않은 레일 노선에 익숙하지 않은 생각 때문에

여기에 간단한 경로가 있습니다.

resources :posts 
+1

.. 범위에 편안한 ID를 포함하지 않습니다. –

+0

@AmitSharma 예 친절한 ID 만 사용하고 있지만 위와 같이 작동 할 수 있습니다. – overflow

+0

@Seting, 현재 URL에 "41"이 무엇을 의미합니까? –

답변

7

여기에 귀하의 질문에 실제로 두 가지 문제가 포함되어 있으므로 두 가지 모두에 대한 제안을하겠습니다.

첫 번째 문제

1. 중첩 된 자원은 "중첩 된 경로"를 사용하는 것입니다. Rails 가이드에는 경로와 중첩 된 경로를 포함하여 경로를 작성하고 사용하는 방법에 대해 길고 유익한 기사가 있습니다. 여기에서 확인할 수 있습니다 : http://guides.rubyonrails.org/routing.html#nested-resources.당신은 당신이 3 참조, 내가 제거 게시물을 가지고이

<%= link_to product_model.name, category_sub_category_product_model_path(@category, @sub_category, @product, product_model) %> 

지금처럼 greate 링크를 볼 수 있습니다

resources :category do 
    resources :sub_category do 
    resources :products do 
     resources :models 
    end 
    end 
end 

:

그러나 상황에 해결책은 다음과 같을 것이다. 리팩토링 디자인
을 참조하십시오. 당신이 정말로 게시물에 대한 조치로이 원하는 경우에, 당신은 그러나이 같은 일을해야한다 (그러나이 추천 할 것입니다!) : 이것은 귀하의 의견에 다음과 같이 사용되는

get "posts/product/:category_id/:subcategory_id/:product_id/:model_id", to "posts#product", as: :posts_product 

:

<%= link_to product_model.name, posts_product_path(@category, @sub_category, @product, product_model) %> 

2. 예쁜 URL의

두 번째 문제는 URL에 ID 대신 모델 이름을 사용하는 것입니다. 이에 대한 simpels 솔루션은 id 대신 사용할 수있는 고유 한 특성을 모델에 가지고 있으며 그 다음 to_param 메서드를 추가하면됩니다. 제품에 대한 FX는 우리가 이런 식으로 뭔가를 할 수 :

class Product < ActiveRecord::Base 
    def to_param 
    name 
    end 
end 

라이언 베이츠

이것에 대해 좋은 스크린 캐스트를 만들었습니다 : http://railscasts.com/episodes/63-model-name-in-url-revised합니다. 더 유연한 것을 원하면 Friendly Id을 사용하십시오. 그리고 Ryan은 또 다른 위대한 RailsCast : http://railscasts.com/episodes/314-pretty-urls-with-friendlyid으로 구출합니다.

3. 변경 디자인

좋아, 잘가, 그래서 그냥 내 의견을 무시 주시기 바랍니다. 그러나 그들은 당신의 예에서 나쁜 습관과 징조입니다. 그래서 제가 여러분이 개선해야한다고 생각하는 것들을 신속하게 통과 시키도록하겠습니다.

평안한 작업을 항상 편안하지 컨트롤러 액션을 만들지 않도록 가능하면 당신은, (간단하게 말해서해야

은 기본 작업 지수, 쇼, 새, 생성, 편집, 업데이트입니다 유일한 편안한 조치를 파괴). 귀하의 예에서 이것은 포스트 컨트롤러의 제품 동작이 안정된 것으로 변경되어야 함을 의미합니다. 왜 그것을 제품 모델 컨트롤러로 옮기고 "show"라고 부르지 않습니까?

중첩 자원

당신은에 깊이 당신의 경로를 중첩하지 않도록해야합니다. 카테고리, 하위 카테고리, 제품 및 모델을 모두 귀하의 URL에 표시하는 것이 중요합니까? 아마 당신의 모델이 당신의 애플리케이션에서 내부적으로 어떻게 연관되어 있겠지만, 사용자는 이것을 왜 알아야할까요? "/ posts/product"에 하위 카테고리 목록이없고 "posts/product/41"에 제품 목록이 없으면 경로가 길어질 이유가 없습니다. 엄지 손가락의 규칙은 "더 깊지도 않고 두 단계가 아닙니다"즉, 둥지입니다. ": category/: sub_category". 더욱 더 짧은 경로는 더 나은 SEO를 의미합니다.

내가 말했듯이 이러한 제안을 무시해도 응용 프로그램은 이러한 변경없이 작동합니다. 그러나 이러한 것들을 변경하면 코드를 구조화하고 코드베이스를 깨끗하고 유지 보수 가능하게 유지하는 데 큰 도움이됩니다. 이 규칙과 원칙은 내가 방금 만들었지 만 Rails 커뮤니티에서 매우 받아 들여지는 원리는 아닙니다.이 원칙이나 패턴을 각각 google 할 수 있으며 특히 레일스 작업을 할 때 많은 도움이되는 이유에 대한 기사와 게시물을 볼 수 있습니다.

자원

1

model.rb

def to_param 
    name 
    end 

모델이 추가 한 다음 위에서 언급 한 바와 같이 방법을 보여 당신에 @model = Model.find_by_name(params[:id])는 다음 URL을 얻을 수 있습니다 추가 할 수 있습니다.

PS : 당신은 당신의 스키마모델 테이블 이름 필드가 있어야합니다.

1

중첩 된 경로를 찾고 있다고 생각합니다. 이 링크 http://guides.rubyonrails.org/routing.html#nested-resources

를 참조하고 이름은 특정 모델에 대한 모델 속성입니다 @Ajay 쿠마

def to_param 
    name 
end 

에 의해 설명 된 바와 같이 ID 대신 MODEL_NAME를 표시하려면 모델에 to_param 방법을 사용하십시오.

1

왜 네임 스페이스에 대한 좋은 RailsCast이있다?

namespace :posts do 
    resources :products 
end 

이 내가 생각해야 ..

네임 스페이스는 사용자 친화적 인-ID 보석을 사용할 수 있습니다