2014-06-24 50 views
1

Rails有基本的REST操作create/update/show/destroy,但是如果我想創建或更新現有記錄的操作,我應該爲此創建自定義操作?我應該爲create_or_update操作使用什麼操作

我知道rails有first_or_initialize,但它似乎不符合創建或更新的定義。

在我的理解create應該創造一個新的記錄,而不是更新現有的和update應該更新,而不是創建一個新的。

下面是一個例子:

我有模型BlogTag和連接表Blog_Tags其參考blog_idtag_iduser_id記錄誰提出這個標籤這個博客帖子。

[Blog]>-[Blog_Tag]-<[Tag] 
      | 
     [User] 

我認爲

我在這個例子中新的思維行動PUTcreate_or_update和路線會和我有路線blog/[blog_id]/tag/[tag_id_to_add]/create_or_update。不知道這是否正確。

+0

不。不要嘗試添加自己的方法。不要做奇怪的事情,以避免多個請求。另外,PUT可能是你想要的。它將在給定的URI處創建資源,或者更新(替換)該URI處的現有資源。 – thecoshman

回答

0

我最終有一個像博客路徑/ [blog_id] /標籤/ [TAG_ID] /建議其去奉獻控制器SuggestionController在那裏我定義建議的行動那裏。

0

把它放在創建或更新沒有區別。我會選擇更新,因爲該方法將調用更新。只要確保清楚地記錄了該操作可以創建和更新模型。

def update 
    user = User.find_or_initialize_by(email: user_params[:email]) 
    user.update_attributes(user_params) 
end 

至於動詞,定義資源的更新操作默認應該有POST/PUT動詞。

0

您可以使用:find_or_initialize或find_or_create

For example, in Rails 4 syntax: 

    blog = Blog.find_or_initialize_by(name: "abc") 
    blog.update(name: "xyz") 

Rails 3: 

    blog = Blog.find_or_initialize_by_name("abc") 
    blog.update_attributes(name: "xyz") 

如果記錄是新初始化更新或update_attributes方法將嘗試將其保存。

你可以閱讀這個鏈接http://apidock.com/rails/v4.0.2/ActiveRecord/Relation/find_or_create_by

相關問題