【问题标题】:What action should I use for create_or_update operation我应该对 create_or_update 操作使用什么操作
【发布时间】:2014-06-24 16:36:55
【问题描述】:

Rails 具有基本的 REST 操作创建/更新/显示/销毁,但如果我想要创建或更新现有记录的操作,我应该为此创建自定义操作吗?

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

据我了解,create 应该创建新记录而不更新现有记录,update 应该更新而不创建新记录。

这是一个例子:

我有模型 BlogTag 和一个连接表 Blog_Tags,它引用了 blog_idtag_id 和一个 user_id 来记录谁向这篇博文推荐了这个标签。

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

我的想法

我正在考虑这个例子的新动作PUTcreate_or_update,路线是,我有路线blog/[blog_id]/tag/[tag_id_to_add]/create_or_update。不知道这样对不对。

【问题讨论】:

  • 没有。不要尝试添加您自己的方法。不要为了避免多次请求而做奇怪的事情。此外, PUT 可能是您想要的。它将在给定的 URI 上创建资源,或更新(替换)该 URI 上的现有资源。

标签: ruby-on-rails rest crud


【解决方案1】:

将其放入 create 或 update 没有区别。我会选择更新,因为该方法将调用更新。只需确保清楚地记录该操作可以创建和更新模型即可。

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

至于动词,对已定义资源的更新动作默认应该有一个 POST/PUT 动词。

【讨论】:

    【解决方案2】:

    您可以使用: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

    【讨论】:

      【解决方案3】:

      我最终有类似 blog/[blog_id]/tag/[tag_id]/suggest 的路径,它转到专用控制器 SuggestionController 我在那里定义建议操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-20
        • 2015-07-01
        • 2019-06-14
        • 1970-01-01
        • 2014-11-27
        • 1970-01-01
        • 2011-09-19
        相关资源
        最近更新 更多