我应该对create_or_update操作使用什么操作

时间:2014-06-24 16:36:56

标签: ruby-on-rails rest crud

Rails有基本的REST操作create / update / show / destroy,但是如果我想要创建或更新现有记录的操作,我应该为此创建自定义操作吗?

我知道rails有first_or_initialize,但它似乎不适合创建或更新的定义。

根据我的理解create应创建新记录而不更新现有记录,而update应更新而不创建新记录。

以下是一个例子:

我有模型BlogTag和加入表Blog_Tags,引用blog_idtag_iduser_id来记录谁在此博客文章中建议此标记。

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

我的想法

我正在考虑针对此示例的新操作PUT create_or_update,路线将是,我有路由blog/[blog_id]/tag/[tag_id_to_add]/create_or_update。不知道这是不对的。

3 个答案:

答案 0 :(得分:0)

将其置于创建或更新中没有任何区别。我会选择更新,因为该方法将调用更新。只需确保明确记录该操作可以创建和更新模型。

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

对于动词,默认情况下,已定义资源的更新操作应该有POST / PUT谓词。

答案 1 :(得分: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或update_attributes将尝试保存它。

您可以阅读此链接http://apidock.com/rails/v4.0.2/ActiveRecord/Relation/find_or_create_by

答案 2 :(得分:0)

我最终有像blog / [blog_id] / tag / [tag_id] / suggest这样的路径,专门用于控制器SuggestionController,我在那里定义了建议操作。