2009-11-13 52 views
2

假設我有一個模型富,我的模型有一個發佈!方法可以改變該模型上的一些屬性,也可能改變其他一些屬性。如何最好地通過API公開Rails方法?

現在,Rails的方式建議我將我的模型暴露在休息狀態,並讓最終用戶使用參數來使用猴子。

如果我想曝光我的發佈,該怎麼辦?方法來保護我的模型?這甚至是看這個的最好方法嗎?

回答

4

由於您試圖以REST方式執行此操作,因此您首先需要做的是找到資源 - 您可以使用某個HTTP動詞查詢某個資源。

我想說我們需要在這裏識別的「事物」是foo的狀態。翻譯成一個URL:

/foos/:id/status 

混凝土FOO的狀態是一種資源 - 這是試圖將REST兼容,當我們需要的第一件事。當我們發佈一些foo時,這意味着我們改變(更新)它的狀態,對吧?所以,我們接下來要做的是創建一個路由和一個處理「更新foo狀態」請求的方法。

要做到這一點,只需添加這到您的routes.rb文件:

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

,並添加像這樣到您的Foo控制器文件:

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

這樣你最終會與一個非常體面的RESTful設計。

0

您可以在您的FooController中添加一個名爲publish!方法的方法。

例:

在配置/ routes.rb中

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

在app /控制器/ 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中有一個動詞。 – 2009-11-13 15:40:23

+0

他實際上並沒有說他擔心嚴格遵守REST-ful。如果他是,你的解決方案要好得多。 – 2009-11-13 15:47:53

+0

這是一個公平點。 – 2009-11-13 15:54:04

相關問題