什么是在Rails 3中“喜欢”某些东西的正确RESTful方式?

时间:2011-02-08 21:30:19

标签: ruby-on-rails-3 rest jquery

假设我有一个显示视频的Rails 3应用。用户可以“喜欢”或“不喜欢”视频。此外,他们可以喜欢/不喜欢游戏等其他内容。我需要在整体设计方面提供一些帮助,以及如何处理RESTful路由。

目前,我有Like Class使用多态设计,以便对象“可爱”(likeable_id,likeable_type)

我想通过AJAX(jQuery 1.5)来做这件事。所以我想的是:

的javascript

// these are toggle buttons
$("likeVideo").click( function() {
    $.ajax({
        url: "/likes/video/" + video_id,
        method: "POST",
        ....
    });
} );

$("likeGame").click( function() {
    $.ajax({
        url: "/likes/game/" + game_id,
        method: "POST",
        ....
    });
} );

rails controller

Class Likes < ApplicationController
    def video
        # so that if you liked it before, you now DON'T LIKE it so change to -1
        # or if you DIDN'T like it before, you now LIKE IT so change to 1
        # do a "find_or_create_by..." and return JSON
        # the JSON returned will notify JS if you now like or dislike so that the 
        # button can be changed to match
    end

    def game
        # same logic as above
    end
end

路线

match "/likes/video/:id" => "likes#video", :as => :likes_video
match "/likes/game/:id" => "likes#game", :as => :likes_game

这个逻辑看起来是否正确?我正在通过AJAX进行POST。从技术上讲,我不应该做一个PUT吗?或者我对此过于挑剔?

另外,我的控制器使用非标准动词。与videogame一样。我应该担心吗?有时我会对如何匹配“正确”的动词感到困惑。

另一种方法是使用包含类型(游戏或视频)的数据结构发布到/likes/:id之类的内容。然后我可以将它包装在控制器中的一个动词中......甚至可以更新(PUT)。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:2)

Rest architectural style未指定您应该使用哪个“动词”。它只是说如果他们想要连接器就可以使用HTTP。

您要找的是HTTP specifications for method definitions。特别是POST适用于:

  - Annotation of existing resources;
  - Posting a message to a bulletin board, newsgroup, mailing list,
    or similar group of articles;
  - Providing a block of data, such as the result of submitting a
    form, to a data-handling process;
  - Extending a database through an append operation.
PUT:

  

请求将所包含的实体存储在提供的Request-URI下。如果Request-URI引用已存在的资源,则封闭的实体应该被视为驻留在源服务器上的实体的修改版本。

您的功能属于哪个类别取决于您 - 只要您与自己保持一致。