2010-05-04 3 views
1

현재 RESTful MembershipsController를 설계하려고합니다. 컨트롤러 동작 업데이트는 승격, 금지, 승인, ... 멤버에만 사용됩니다. 업데이트 작업을 호출하려면 URL에 적절한 값이있는 type이라는 매개 변수가 있어야합니다. 그것이 정말 RESTful 한 디자인인지 잘 모르겠습니다. 오히려 회원 증강을위한 세퍼레이트 (sepearate) 활동을 소개해야합니까?RESTful 회원

class MembershipsController < ApplicationController 
def update 
    @membership= Membership.find params[:id] 
    if Membership.aasm_events.keys.include?(params[:type].to_sym) #[:ban, :promote,...]  
     @membership.send("#{params[:type]}!") 
     render :partial => 'update_membership' 
    end 
    end 
end 
+0

미디어 유형이 REST 인 경우. 미디어 유형은 어디 있습니까? – ordnungswidrig

답변

0

제게 이것은 REST 규칙을 고수하기 위해 머리를 뽑지 않아야하는 경우 중 하나입니다. 귀하의 모델은 전통적인 CRUD 개념에 맞지 않는 것처럼 보이며 HTTP 동사를 통해 동작을 차별화하는 RESTful 원칙은 여기에도 속하지 않는 것처럼 보입니다.

내가 당신 인 경우 회원 자격으로해야 할 일 (가능하면 DRY 상태를 유지하려고 시도)에 대해 해당 조치를 별도의 조치로 분리합니다. 그러면 컨트롤러 코드가 더 읽기 쉽습니다. 그리고 일부 경로를 작성하여보기 코드를 더 깨끗하게 만들 수도 있습니다 (promote_membership_path 등). 그러나 그것은 단지 나다. 그래서 가장 적합한 것을 보라.

편집 : http://www.therailsway.com/2009/6/22/taking-things-too-far-rest

+2

나를 용서하되 너는 심술 궂은 날에 나를 붙 잡았다. 당신이 Rails 개발자라는 것은 놀랄 일이 아닙니다. 레일의 REST에 대한 정의는 로이의 정의와 거의 유사하지 않은 배제입니다. REST는 CRUD가 아닌 서비스를 처리 할 수 ​​있습니다. Rails 프레임웍과 REST에 대한 정의는 분명히 어렵게 만든다. –

+0

레일의 '휴식의 정의'가 의미하는 바를 잘 모르겠지만 레일에서는 표준 CRUD 작업을 단순화해야하기 때문에 편안한 리소스가 나타났습니다. REST가 CRUD가 아닌 리소스를 처리 할 수 ​​없다는 것을 의미하지는 않습니다. REST를 레일에 도입한다는 초기 목표 때문에 CRUD를 넘어서는 일들이 더 어려워 질 것이라고 말하고자했습니다. –

+2

귀하의 의견에 동의하지만 그건 원래 답변을 읽는 방법이 아닙니다. Rails의 Rails 정의에 대한 제 코멘트에서 레일스는 URL의 모양에 너무 많은 초점을 맞추고 사용되는 미디어 유형에 관해서는 너무 적습니다. –

3

둘 : 여기

조금 견해를 설명하는 글이다. 컨트롤러가 처리해야하는 유일한 "액션"은 GET, PUT, POST, DELETE (+ 다른 http 동사)입니다. 나는 "레일"이라는 태그로이 글을 게시하는 것이 이단이라고 생각하지만 오늘은 상관하지 않습니다.

이렇게하려면 RESTful 한 방법은 이러한 각 작업에 대해 새로운 "처리 리소스"를 만들고 해당 리소스를 해당 리소스로 POST하여 작업을 호출하는 것입니다.

새 리소스를 만들면 새로운 컨트롤러를 만드는 것으로 해석 할 수 있습니다.

+0

필자의 대답에 대한 논평에서 논의 된 이유 때문에, 레일에 배열되는 방식이 저자가 문제를 해결하는 방법에 어떤 영향을 미치기 때문에 '레일스'라는 태그가 반드시 필요하다. btw 나는 그 선생님에게 말할 사람이 아니지만, 당신의 말에있는 감정은 당신의 아이디어를 통해 도움이되지 않을 것입니다. –

0

음, 일을하는 방법은 여러 가지가 있습니다. 자신에게 물어야하는 질문은 얼마나 많은 주가 있습니까? 얼마나 자주 새로운 주가 추가됩니까? 기타

많은 주정부가없는 경우 검색을 위해 필터 앞에 별도의 작업을 추가로 만들지 만 이는 개인적인 취향에 더 가깝다고 생각합니다. 정말로 짧게하고 싶다면 각 메소드를 한 행에 넣을 수 있습니다. 그래서 : 네, 업데이트 방법은 완벽하게 편안하고이지만, PUT은 멱등되어야한다는 것을 기억

class MembershipsController < ApplicationController 
    before_filter :find_membership 

    def ban;  @membership.ban!;  render :partial => 'update_membership' end 
    def promote; @membership.promote!; render :partial => 'update_membership' end 

    protected 

    def find_membership 
    @membership = Membership.find(params[:id) 
    end 
end 

은 편안하고 있는지 여부를 귀하의 질문에 대답합니다. 따라서 동일한 방법을 두 번 실행하면 결과가 동일합니까? 즉 사용자를 차단하고 다시 금지하면 어떻게됩니까?