문제

(예제는 내 사용 사례를 단순화한 것입니다.)

모델이 있어요 이벤트 하나의 이벤트를 표시하기 위한 기본 경로는 다음과 같습니다.

/events/:id(.:format) ----> activities#show

이제 이벤트에는 year라는 속성이 있고 나도 마찬가지입니다. 이미 다음 경로를 수락합니다.

/events/:year/:id(.:format) ----> activities#show

두 번째 변형이 기본값이 되므로 다음과 같은 코드를 원합니다. redirect_to @event 사용자를 해당 변형으로 유도합니다(예: http://localhost:3000/events/2012/1).

그것을 어디서 정의하나요?

지금까지 덮어쓰려고 노력했습니다. to_param 모델에서는 다음과 같습니다:

def to_param
  "#{self.year}/#{self.id}"
end

...하지만 그게 원인이 될 거야 params[:id] 문자열로 채워지려면 2012/1 .

나는 원해요 params[:id] 아직도 1 ~하는 동안 params[:year] 해야한다 2012.

Rails는 이를 달성하기 위한 표준 방법을 제공합니까?

...아니면 모델에 대한 사용자 지정 메서드를 작성하고 다음과 같이 호출해야 합니까? redirect_to @event.custom_method_to_create_long_url_variant

이러한 방법은 신속하게 구현될 수 있지만, Rails가 간단한 설정을 통해 요구 사항을 처리할 수 있다면 거의 모든 다른 코드를 건드리지 않고 그대로 둘 수 있습니다.

편집하다:

나는 나의 params 변경할 때 값(:id 및 :year)이 예상대로 유지되었습니다. 얻다 기능 테스트에서 get :show, id: @event 에게 get :show, id: @event.id.

이제 질문은 다음과 같습니다.

그게 그냥 그렇게 하는 건지, 아니면 계속 지지할 수 있는 건지 get :show, id: @event ?

도움이 되었습니까?

해결책

이 같은:

match "/events(/:year)/:id(.:format) => "activities#show"

그리고 컨트롤러에 들어가

Started GET "/events/2012/12" for 127.0.0.1 at 2012-03-14 17:25:44 +0400
Parameters: {"year"=>"2012", "id"=>"12"}

아니면 연도 없이

Started GET "/events/12" for 127.0.0.1 at 2012-03-14 17:25:44 +0400
Parameters: {"id"=>"12"}

따라서 컨트롤러에서 사용할 수 있습니다

params[:id]
params[:year]

그리고 url_helper

match "/events(/:year)/:id(.:format) => "activities#show", :as => :my_event

my_event_path(2012, 12) #=> /eventes/2012/12
my_event_path(@event.id) #=> /events/12
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top