假設我有一個模型富,我的模型有一個發佈!方法可以改變該模型上的一些屬性,也可能改變其他一些屬性。如何最好地通過API公開Rails方法?
現在,Rails的方式建議我將我的模型暴露在休息狀態,並讓最終用戶使用參數來使用猴子。
如果我想曝光我的發佈,該怎麼辦?方法來保護我的模型?這甚至是看這個的最好方法嗎?
假設我有一個模型富,我的模型有一個發佈!方法可以改變該模型上的一些屬性,也可能改變其他一些屬性。如何最好地通過API公開Rails方法?
現在,Rails的方式建議我將我的模型暴露在休息狀態,並讓最終用戶使用參數來使用猴子。
如果我想曝光我的發佈,該怎麼辦?方法來保護我的模型?這甚至是看這個的最好方法嗎?
由於您試圖以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設計。
您可以在您的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
當然,你可能需要一些錯誤處理。
這個解決方案有一個問題 - 它違反了REST的一個主要原則 - 你在URL中有一個動詞。 – 2009-11-13 15:40:23
他實際上並沒有說他擔心嚴格遵守REST-ful。如果他是,你的解決方案要好得多。 – 2009-11-13 15:47:53
這是一個公平點。 – 2009-11-13 15:54:04