내 레일 뷰와 컨트롤러는 뒤덮 redirect_to
, link_to
및 form_for
메소드 호출. 때때로 link_to
그리고 redirect_to
그들이 연결하고 경로 (예에서 명시 적입니다 link_to 'New Person', new_person_path
)하지만, 여러 번 경로 (예를 암시 적이다 link_to 'Show', person
).
모델에 단일 테이블 상속 (STI)을 추가하고 (예 :) Employee < Person
이 모든 메소드가 하위 클래스의 인스턴스 (예 :)를 중단합니다 Employee
. 레일이 실행 link_to @person
되면 오류가 발생합니다 undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
. Rails는 객체의 클래스 이름 (직원)으로 정의 된 경로를 찾고 있습니다. 이 직원 경로는 정의되어 있지 않으며 직원 컨트롤러가 없으므로 작업도 정의되지 않습니다.
이 질문은 전에 요청되었습니다 :
- 에서 StackOverflow의 대답은 전체 코드베이스에 LINK_TO 등의 모든 인스턴스를 편집하고 명시 적 경로를 명시하는 것입니다
- 에 StackOverflow에 다시 두 사람이 사용하는 것이 좋습니다
routes.rb
부모 클래스의 서브 클래스 리소스 (매핑map.resources :employees, :controller => 'people'
). 같은 SO 질문에서 가장 좋은 대답은 코드베이스의 모든 인스턴스 객체를 사용하여 유형 캐스팅을 제안합니다..becomes
- StackOverflow의 또 다른 방법은 Do Repeat Yourself 캠프에서 가장 좋은 방법이며 모든 하위 클래스에 대해 중복 스캐 폴딩을 만드는 것이 좋습니다.
- 여기에 다시 같은 질문이 있습니다. 여기서 가장 좋은 대답은 틀린 것 같습니다 (Rails magic Just Works!)
- 웹의 다른 곳에서 에서 F2Andy가 코드의 모든 경로에서 편집을 권장하는 이 블로그 게시물을 했습니다 .
- 블로그 게시물 단일 테이블 상속 및 RESTful 경로Logical Reality Design 에서 위의 SO 답변 2와 같이 서브 클래스의 리소스를 수퍼 클래스 컨트롤러에 매핑하는 것이 좋습니다.
- 알렉스 Reisner는 게시물이 레일에서 단일 테이블 상속 그가에서 상위 클래스에 하위 클래스의 자원을 매핑에 대해 옹호하는,
routes.rb
만 어획량에서 파손을 라우팅하기 때문에,link_to
그리고redirect_to
있지만에서을form_for
. 따라서 하위 클래스가 클래스에 대해 거짓말을 갖도록 부모 클래스에 메소드를 추가하는 것이 좋습니다. 잘 들리지만 그의 방법으로 오류가 발생했습니다undefined local variable or method `child' for #
.
가장 우아한 보인다 가장 공감대를 가지고 (그러나 그것은 모두가 아니다 대답 그래서 그 우아하고도 그 많은 합의)는 당신에 리소스를 추가입니다 routes.rb
. 이 기능이 작동하지 않는 한form_for
. 명확성이 필요합니다! 위의 선택을 증류하기 위해 내 옵션은
- 서브 클래스의 자원을 슈퍼 클래스의 컨트롤러에 매핑한다
routes.rb
form_for를 호출 할 필요가 없기를 바랍니다) - 클래스가 서로에게 있도록 레일 내부 메소드를 대체
- 경로를 변경하거나 객체를 타입 캐스팅하여 객체의 동작 경로가 암시 적 또는 명시 적으로 호출되는 코드의 모든 인스턴스를 편집하십시오.
이 모든 상충되는 답변으로 판결이 필요합니다. 좋은 대답이없는 것 같습니다. 이것이 레일 디자인에서 실패한 것입니까? 그렇다면 수정 될 수있는 버그입니까? 아니면 그렇지 않다면 누군가가 나를 바로 잡을 수 있고 각 옵션의 장단점을 안내하거나 옵션이 아닌 이유를 설명하고 어떤 것이 옳은 답인지, 왜 그런지를 희망합니다. 아니면 웹에서 찾지 못하는 정답이 있습니까?