Rails有基本的REST操作create / update / show / destroy,但是如果我想要创建或更新现有记录的操作,我应该为此创建自定义操作吗?
我知道rails有first_or_initialize
,但它似乎不适合创建或更新的定义。
根据我的理解create
应创建新记录而不更新现有记录,而update
应更新而不创建新记录。
以下是一个例子:
我有模型Blog
,Tag
和加入表Blog_Tags
,引用blog_id
,tag_id
和user_id
来记录谁在此博客文章中建议此标记。
[Blog]>-[Blog_Tag]-<[Tag]
|
[User]
我的想法
我正在考虑针对此示例的新操作PUT
create_or_update
,路线将是,我有路由blog/[blog_id]/tag/[tag_id_to_add]/create_or_update
。不知道这是不对的。
答案 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
,我在那里定义了建议操作。