2012-07-13 2 views
1

저는 여전히 레일이 작동하지 않도록 노력하고 있습니다. 데이터를 입력하고 제출하여 양식을 저장하는 간단한 응용 프로그램을 만들려고합니다. 그러면 저장 될 것입니다. DB에. 나는 새로운 프로젝트를 시작하고 실행하여이 매우 간단있어 : 레일 컨트롤러에 메서드를 만들려고 시도합니다.

$ rails generate scaffold RSVP firstName:string lastName:string 

지금 내가 양식을 통해 새 레코드를 추가 한 후 감사 페이지로 리디렉션합니다.

# GET /rsvps/thank_you 
    def thank_you 
    respond_to do |format| 
     format.html # thank_you.html.erb 
     format.json { render json: @rsvps } 
    end 
    end 

이 줄 내 루트 파일에 있습니다 : :

나는 수동으로 rsvps_controller.rb 파일에 아래의 방법을 추가했습니다 내가 레이크 경로를 실행할 때

resources :rsvps 

내 질문은, , 나는 thank_you 메소드를위한 경로를 보지 못했다. 내 : rsvps 자원이 내 thank_you 경로를 선택해서는 안되며 라우트는 어떤 컨트롤러 메소드가 http 호출 (get, post, put 등)인지 어떻게 알 수 있습니까? 당신처럼 routes.rb 파일 뭔가가 있어야 컨트롤러에서 해당 작업을 명중하는 경로를 얻기 위하여

답변

6

는 :

resources :rsvps do 
    member { get :thank_you } 
end 

또는

resources :rsvps do 
    collection { get :thank_you } 
end 

그것은 당신이 경우에 대한 의존 방금 작성한 자원에 액세스하려고합니다.

@http://guides.rubyonrails.org/routing.html을 보면 라우팅 메커니즘을 간소화하는 데 도움이됩니다.

+0

당신이 제안한'member' 행을 사용할 때, 내 레이크에서이 행을 보았습니다 : routes :'thank_you_rsvp GET /rsvps/:id/thank_you(.:format) rsvps # thank_you'. 왜 그것은': id'를 경로에 기대합니까? – Catfish

+3

리소스 경로의 'member' 메소드는 "개별 레코드와 관련하여 사용됩니다"를 의미합니다. 따라서 ID는 레코드를 찾기 위해 필요합니다. ID를 원하지 않으면 (즉, "컨트롤러의 모든 레코드"에 적용하고 싶거나 개별 레코드와 관련이없는 경우), 두 번째 프레임 당'collection'을 사용해야합니다 예. 명확하게,'member'를 사용하여,': id'는 컨트롤러 메소드 자체 내에서'params [: id]'로 전달 될 것입니다. 하나의 rsvp에서 작동하거나 그 중 일부 또는 전부에 대해 작동하는 것의 차이점입니다. – sinisterchipmunk

3

wlad가 말한 것에 덧붙여서, routes.rb 파일의 자원 : rsvps는 대부분의 모델에 필요한 기본 경로 집합을 만듭니다. index, new, create 또는 show와 같은 것들. thank_you 액션이 레이크 루트에 나타나지 않는 이유는 thank_you가 너무 흔한 액션 중 하나가 아니기 때문에 여분의 코드없이 상자에 포함시켜야하기 때문입니다.

+0

이것들은 RESTful 라우트라고 불리며, 그렇게 할 수없는 좋은 이유가 없다면, 그것들을 고수해야합니다. 특히 당신이 처음 단계에 있다면. 앱을 작동시킨 다음 최종화 개발 작업으로 URL을 맞춤 설정할 수 있습니다. 라우팅 레일에 관해서 가장 멋진 점 중 하나는 루트 헬퍼입니다. 나는 세부 사항에 당신을 지루하게하지 않을 것이나, URL를 주문을 받아서 만들 때 또는 명심할 때 명심하십시오. – pduey

0

각 rsvp에 감사 페이지가 표시되므로 회원 경로를 사용해야합니다. like

resources :rsvps do 
    member get :thank_you 
end 

thank_you의 전체 또는 일부 컬렉션을 표시하려면 thank_you 컬렉션을 사용해야합니다.

이것을 포함시키고 rake 경로를 다시 실행하면 새로운 http 작업이 표시됩니다.

+0

코드를 사용할 때'잘못된 인수 (1은 0)'을 얻습니다. – Catfish

2

감사 페이지에서 해당 모델의 데이터를 표시하려면 rsvp 모델을로드해야하는 경우 회원 경로를 사용해야합니다. 경로의 id는 리소스 멤버 경로이므로 특정 리소스와 연결되어야합니다. 로드 할 내용을 알고있는 URL이 있어야합니다.당신은 단지 당신이 같은 것을 사용할 수있는 컨트롤러 액션을 가리키는 일반적인 경로하려면

resources :rsvps do 
    member { get :thank_you } #GET /rsvps/:id/thank_you(.:format) 
end 

는 :

일치 "/ 답장을/thank_you"=>으로, "답장 번호는 thank_you" " rsvp_thank_you "

2

컨트롤러에 더 많은 작업을 추가 할 수 있지만 레일스 파일을 경로 파일에 지정하지 않으면 레일즈가이 기능을 작업으로 처리하지 않습니다. 사용자가 만든 컨트롤러 클래스에서 다른 함수로 취급됩니다.

조치로 thank_you 기능을 추가하려면 경로 파일에 추가해야합니다.

다른 사람들이 답변에서 설명한 것처럼 여러 가지 방법이 있습니다. memberresources 내부 collection를 사용

  • adding-more-restful-actions

    .

    일부 모델 개체에서만 기능을 사용하려면 member을 사용하십시오. 예 : 사진이 부착 된 신분증에 대한 미리보기가 1
    GET/사진/: ID/예에서

    미리보기

    당신 member 당신은 노선과 기능을합니다.

    GET/답장/: ID/thank_you

    참고 : 멤버 조치로 지정할 때 PARAMS의 ID가 필요합니다.

    resources :rsvps do 
        member do 
        get :thank_you #GET /rsvps/:id/thank_you(.:format) 
        end 
    end 
    

    사용 collection 당신이 좋아 직접 작업을 호출 할 경우

    GET의 /rsvps/thank_you(.:format) 자원

    resources :rsvps do 
        collection do 
         get :thank_you #GET /rsvps/thank_you(.:format) 
        end 
    end 
    

    당신이 필요 경로를 경로에 추가하는 동안 조치 유형 (GET | POST)을 지정하십시오.

    예에서 thank_you는 GET 조치로 지정되었습니다. 둘 중 하나를 선택할 수 있습니다.

match을 사용하면 나만의 preety_urls 또는 평온한 경로를 만들 수 있습니다. (리소스 블록에 정의 된 작업이 필요합니다.) 자세한 내용은 여기 matchhttp://guides.rubyonrails.org/routing.html#non-resourceful-routes

체크 아웃은 당신이 레일 팀에서 만든이 멋진 문서를 통해 이동하는 것이 좋습니다 (한 번 더).) http://guides.rubyonrails.org/routing.html

건배.

+0

멋진 답변에 감사드립니다. 나는 라우팅 가이드를 두 번 읽거나 건너 뛴다. 거기에 많은 정보가 있으므로 그것은 꽤 힘듭니다. – Catfish

+0

또한 'get'/ rsvps/thank_you '와 같이 할 수도 없습니다. : to =>'rsvps # thank_you''? 이것은 작동하지 않지만 비슷한 것을 할 수있을 것이라고 생각했습니다. – Catfish

관련 문제