2009-11-13 6 views
2

내가 foo라는 모델을 가지고 있고 내 모델에 게시가 있다고 가정 해 봅시다. 메서드를 사용하여 해당 모델과 잠재적으로 몇 가지 속성을 변경합니다.API를 통해 레일스 메소드를 노출하는 가장 좋은 방법은 무엇입니까?

이제 Rails는 내 모델을 나머지 부분에 노출시키고 최종 사용자 원숭이에게 매개 변수를 제공하도록 제안합니다.

게시를 공개하려면 어떻게해야합니까? 방법 대신 내 모델을 보호하기 위해? 이것도 이것을 보는 가장 좋은 방법입니까?

답변

4

REST 방식으로이 작업을 수행하려고하므로 먼저 HTTP 동사 중 하나를 사용하여 쿼리 할 수있는 리소스를 찾으십시오.

나는 여기에서 확인해야 할 "것이"상태 인 foo이라고 말하고 싶습니다. 의 URL로 번역 : 콘크리트의 foo

/foos/:id/status 

상태는 자원이다 - 그 준수 REST 수하려고 할 때 우리가 가장 먼저해야 할 일이다. 우리가 어떤 foo를 발표 할 때, 그것은 우리가 그 상태를 변경 (업데이트)한다는 것을 의미합니다, 맞습니까? 그래서 우리가해야 할 일은 "foo의 업데이트 상태"요청을 처리 할 경로와 메소드를 만드는 것입니다.

map.connect "/foos/:id/status", :controller => "foos", :action => "change_status", :conditions => { :methods => :put } 

을하고, FOOS 컨트롤러 파일로이 같은 추가 :

이 작업을 수행하려면, 당신의 routes.rb 파일에이 추가가 될 겁니다 이러한 방식으로

# simplified 
def change_status 
    status_name = params[:status_name] 
    foo = Foo.find(params[:id]) 
    foo.publish! if status_name == "published" 
end 

꽤 괜찮은 RESTful 디자인으로

0

publish! 메서드를 호출 한 FooController에 메서드를 추가 할 수 있습니다.

예 :

설정/routes.rb에서

:

map.publish_foo "/foos/:id/publish/:bar", :controller => "foo", :action => "publish" 

응용 프로그램/컨트롤러/foo_controller.rb 물론

def publish 
    @foo = Foo.find params[:id] 
    @foo.publish!(params[:bar]) 
    flash[:notice] = "Your Foo has been published." 
    redirect_to @foo 
end 

에, 당신은 아마 오류 처리를합니다.

+0

이 솔루션에는 하나의 문제가 있습니다. 이는 REST의 주요 지침 중 하나에 위배됩니다. URL에 동사가 있습니다. –

+0

그는 실제로 그가 엄격하게 REST-ful에 머무르는 것에 관심이 있다고 말하지 않았습니다. 그가 있다면, 당신의 해결책은 훨씬 낫습니다. –

+0

그건 중요한 지적입니다. –

관련 문제