2

我想知道为什么当您使用 map.resources 在 Rails 中创建安静的路线时,它会生成新、创建、编辑、更新的操作?仅声明一个用于创建更新的操作 并执行此类操作有什么问题吗?

def create
  unless post?
     @user = User.new
  else
     redirect_to :action => 'index' if user.create(params[:user])
  end
end

所以我们可以有类似的东西

:GET  users/create # to show the form (same as action - new)
:POST users/create # to create a new user

由于 Restful 是基于动词的,这不是最好的使用方法吗?

感谢您的关注

4

1 回答 1

4

我认为这里有两个相关但不同的问题:暴露的 URL 和它们被路由到的控制器方法。由于其中任何一个都可以独立更改,因此我将分别解决它们。另外,请注意,我将稍微松散地谈论在 Rails 上下文中实现的 REST。

在外部 URL 方面,我认为这有助于区分构成系统 API 的 URL(:GET users/1:PUT users/1等)和只是为了方便人们使用 Web 浏览器而存在的 URL(users/newusers/5/edit等) . API 是关于获取资源或以某种方式与它们交互的——这些是另一台计算机在与您的系统交互时将使用的 URL。这些 URL 通常只是您要与之交互的资源的地址,然后您使用 HTTP 方法和参数来指示您想要做什么(GET = 显示此资源,PUT = 更改此资源等)。方便的 URL 用于显示表单,使人们更容易使用 API。你可以通过使用 curl 手动输入您想要更改的所有参数并向 users/1 发送 POST 来编辑用户,但作为一个人,如果您可以使用表单会容易得多。

那么,看看你上面的例子,:GET users/create可能是有意义的(并且与:GET users/new默认的非常相似),但:POST users/create会粗略地翻译为“为用户/创建一个新的”,这不太有意义。

就控制器方法而言,“new”和“create”正在执行根本不同的任务,希望从前面的段落中可以清楚地看到。其中一个是显示表单,另一个是创建新资源。当然,您可以重载相同的方法来执行此操作,但没有令人信服的理由,创建两个小的独立方法来处理两个小的独立任务可能是一种更自然的方法。

于 2009-09-13T13:53:12.113 回答