2009-11-20 5 views
0

나는 레일에서 내 응용 프로그램에 대한 몇 가지 좋은 편안하고 구조를 만들려고 해요하지만 지금은 불행히도 잘 모르겠어요 개념 작용에 붙어 그 말이 맞다면 누군가가 나를 도울 수 있다면 아주 좋을 것입니다.레일 - 편안하고 라우팅 - 회원에 대한 POST를 추가 즉, (팁/6)

편안하고 경로에 대해 우리가합니다 (주석들)

collection 
    :index => 'GET' 
    :create => 'POST' 
    #:?  => 'PUT' 
    #:?  => 'DELETE' 

member 
    :show => 'GET' 
    #:?  => 'POST' 
    :update => 'PUT' 
    :destroy => 'DELETE' 

이 경우 난 단지 기본 수준의 행동에 대해서 이야기하고 또는 즉 http://domain.com/screename/tips 또는 http://domain.com/screename/tips/16 내에서 직접 발생하는 사람이 나타났습니다 경우

하지만 회원에 대한 POST의 가능성이 없다는 것을 알 동시에

, 아무도 이유를 알고?

내가 그 다른 onwer와 클론 자체 자체 포함 된 항목을 만들려고한다면?

나는 이것이 멤버 액션 내부의 POST 메서드에 의해 생성 될 것이라고 확신하지만 불행히도 맵에 기본 메소드가 없다는 것을 알 수있다.

내가 사용하는 뭔가를 시도 : 회원, 또는 : 새를하지만이 때문에이 http://domain.com/screename/tips/16/add 내부에 접근 할 것

map.resources :tips, :path_prefix => ':user', :member => {:add => :post} 

하지 http://domain.com/screename/tips/16처럼 작동하지 않습니다.

그래서 어떻게 편안 경로의 구성원에 대한 "기본"POST 방법을 만들 수 있을까요?

나는 그것이 REST 선언의 일부는 아니지만 이상 빠른 검색으로 내가 찾은 때문에 어쩌면이가 아니라고 생각했다

:

POST

을 컬렉션을 위해 : 콜렉션에 의해 ID가 자동으로 지정된 콜렉션에 새 항목을 작성하십시오. 생성 된 ID는 일반적으로이 작업에서 반환하는 데이터의 일부로 포함됩니다.

구성원의 경우 : 주소 지정된 구성원을 고유 한 권한으로 처리하고 새 하위 구성원을 만듭니다.

DELETE 메서드 또는 PUT 콜렉션을 생각하면이 개념은 여전히 ​​동일합니다. 한 명만 대신 모든 컬렉션을 삭제하려면 어떻게해야합니까? 또는 그들을 대체 (PUT)?

그래서 어떻게 map.resources에 빠진 것 같다이 특정 방법을 만들 수 있을까? 그것 뿐이다

, 내가 이해하기는 쉬운 바랍니다.

건배

답변

2

그들이 포함되지 않은 이유는 보안이 확보 될 때까지 위험하다는 것입니다. 멤버 POST는 PUT/DELETE 콜렉션이 아닙니다. 누락 된 구성원 POST는 기본 콜렉션 POST 조치에 의해 중복되는 경우입니다.

이러한 추가 기본 동작을 추가하려는 경우 수행 할 수있는 유일한 방법은 ActionController :: Resources 비트를 다시 작성하는 것입니다.

그러나 이것은 어렵지 않습니다. 실제로 두 가지 방법 만 다시 작성하면됩니다. 그렇다하더라도 완전히 다시 작성할 필요는 없습니다. 이러한 메소드에 추가해야하는 메소드 비트는 실제로 목표를 달성하기위한 인수 처리가 복잡하지 않습니다. 따라서 alias_method_chain의 간단한 쌍으로 얻을 수 있습니다.

오류가 없다고 가정하면 다음을 포함하여 추가 경로가 아래 설명 된대로 생성됩니다. 그러나 당신의 자신의 위험에 그렇게하십시오.

module ActionController 
    module Resources 
    def map_member_actions_with_extra_restfulness(map, resource) 
     map_member_actions_without_extra_restfulness(map, resource) 
     route_path = "#{resource.shallow_name_prefix}#{resource.singular}" 
     map_resource_routes(map, resource, :clone, resource.member_path, route_path, :post, :force_id => true) 
    end 

    alias_method_chain :map_member_actions, :extra_restfulness 


    def map_default_collection_actions_with_extra_restfullness(map, resource) 
     map_default_collection_actions_without_extra_restfullness(map,resource 
     index_route_name = "#{resource.name_prefix}#{resource.plural}" 

     if resource.uncountable? 
     index_route_name << "_index" 
     end 

     map_resource_routes(map, resource, :rip, resource.path, index_route_name, :put) 
     map_resource_routes(map, resource, :genocide, resource.path, index_route_name, :delete) 
    end 

    alias_method_chain :map_default_collection_actions, :extra_restfulness 
    end 
end 

이러한 새로운 행동에 대한 의미있는 방법을 만들 것입니다 자원 X를 생성/해당 스크립트를 확인하기 위해 주위에 발전기 엉망해야합니다.

이제 실용적인 부분을 살펴 보았습니다. 이론에 대해 이야기 해 보겠습니다. 문제의 일부가 누락 된 동작을 설명하는 단어와 함께 올라오고 있습니다.

POST에 대해 설명한 회원 동작은 기술적으로 올바르지 만 ActionController 및 기본 ActiveRecord에 적용 할 때는 유지되지 않습니다. 기껏해야 모호합니다. 최악의 경우 가능하지 않습니다. 나무 같은 재귀 적 특성을 지닌 자원이나 다른 종류의 자원이 많은 자원에 대해서는 의미가 있습니다. 그러나이 두 번째 경우는 모호하며 이미 Rails에서 다룹니다. 대신 컬렉션 POST에 대한 복제본을 선택했습니다. 기존 레코드의 기본 게시물에 가장 적합했습니다. 그것은 바로 소리 때문에

collection 
    :index  => 'GET' 
    :create  => 'POST' 
    :rip   => 'PUT' 
    :genocide => 'DELETE' 

member 
    :show => 'GET' 
    :clone => 'POST' 
    :update => 'PUT' 
    :destroy => 'DELETE' 

내가 DELETE 수집을 위해 대량 학살을 선택했다 : 여기에 내가 결정의 기본 작업의 나머지 부분입니다. 필자는 컬렉션 PUT에 대해 립을 선택했다. 왜냐하면 내가 일해온 회사라는 용어가 한 공급 업체의 모든 장비를 다른 업체의 장비로 교체하는 고객의 행동을 묘사하는 용어 였기 때문이다.나는 항상 내 질문이 컬렉션의 기본 수준에서 여러 방법을 파괴하고 업데이트 설정하는 방법을했다, 그래서 데이터베이스 레코드와의 존재를 잊고 야하기 때문에

+0

그건 정말 클래스 EMFi, 정말 고마워요. :) 이제 상황의 기술적 측면과 이론적 측면을 모두 이해 한 이후로 이해하기가 훨씬 쉬워졌습니다. 내 애플 리케이션을위한 라우팅 아키텍처를 구축하기 전에 이런 식으로 생각하기 시작할 것이다. 정말 고마워. +1 !!! – zanona

0

나는 여러 레코드를 업데이트하거나 삭제할 경우 오히려 하나의 레코드 하나에서보다 update_multiple 또는 destroy_multiple에 대한 수집 경로를 추가 할 수 있습니다, 아주 다음 아니지만,이 당신의 마지막 질문에 대한 답을 시간.

나는 오늘 그 질문에 실제로 대답했다. 당신은 그 here을 찾을 수있다.

특정 구성원에 대한 POST가없는 이유는 해당 구성원 레코드가 데이터베이스에 이미 있으므로 사용자가 할 수있는 것은 GET (조회), PUT (업데이트) 또는 DELETE (삭제)입니다.). POST는 새 레코드를 만들기위한 용도로만 설계되었습니다.

기존 회원을 복제하려는 경우 원본 회원을 "중복"회원 작업으로 가져오고 그 내용이 포함 된 리소스 루트에 POST하려고합니다.

내가 무엇을 묻고 있는지 알려주세요.

+0

안녕 bensie는, 덕분에 많은 동료, 나는 항상 REST에 내 초점을 잃고 as/screename/tips /를 PUT 또는 DELETE와 함께 사용하십시오. 기본 이름을 사용하는 특별한 이름입니까? 왜냐하면 내가 테스트했기 때문에/screename/tips/destroy_multiple을 콜렉션 메소드로 추가하면된다. 그래서 지금 내 질문을 이해하기 : 왜 안/screename/팁 대신 DELETE 메서드로? 더 정확하지 않겠습니까? 왜 메서드 이름을 추가 할 필요가 있습니까? – zanona

+0

POST에 관해서는 실제로 볼 수 있습니다. :)이 경우에는/screename/tips/POST와 함께 사용자를위한 팁을 추가해야 할 경우이 경우에는 얕은 라우팅을 사용합니다. POST 대신에/tips/users와 비슷하게 보이므로 모든 게시물이 라우트에 목적지를 작성해야 함을 알았습니다. 다시 설명해 주셔서 감사합니다. 그러나 하나의 질문은 여전히 ​​User.first << Tips.first가 업데이트되지 않았거나 habtm 연관에 대한 삽입을 생성하는 방법을 반영하는 것입니다. 어떤 지시자가 올바른 지시어가 될까요? – zanona

+0

나는 당신이 무엇을 얻고 있는지 보았다. 리소스의 루트에 대한 DELETE가 내장되어 있지 않은 이유는 표준 관점에서 무엇을 삭제해야할지 모르기 때문입니다. DELETE 호출 될 때 모든 레코드를 파괴해야합니까? 위험 할거야. 그래서, 당신은 당신이 찾고있는 것을 얻기 위해 : collection => {: destroy_multiple => : delete, : update_multiple => : put}을 추가해야합니다. – bensie