icon Rails 的相关感想

RESTful Ruby on Rails -- 单数与复数

在上一章的RESTful Ruby on Rails -- 美丽与复杂中,已经写到在 Rails 的 REST 世界,因为太抽象而很难理解。

这次将要谈到 Rails 的 REST 对于日本人来说特别难的地方。

这就是必须要清楚地认识英语单词单数和复数的差异。

当然了,在 REST 的概念被引入之前,在使用 Rails 进行程序开发时,我们已认识到 company 和 companies 的差异。

表名就叫 companies,模型名就叫 Company。

把这个作为常识性的约定完全记住就可以了。可是,在 REST 的世界中,必须仔细地考虑文本里应用程序所处理的这个资源是集合的 (collective) 还是个体的 (individual),然后决定是用英语单词的单数来表示还是复数来表示。

例如,在 config/routes.rb 这样写,设定资源 companies。

ActionController::Routing::Routes.draw do |map|
  map.resources :companies
end

于是,表示 ID 123 的 Company 对象的 URL 路径就成为 /companies/123 ,生成的这个 URL 路径的辅助方法company_path(company) 也被定义。

另一方面,表示 Company 对象的列表的 URL 路径成为 /companies ,生成的这个 URL 路径的辅助方法companies_path 也被定义。

注意 company_path(company)companies_path 的不同!

这对于语言上没有单数和复数之分的日本人来说是非常麻烦的。

然后,改写 config/routes.rb ,将名称为 divisions 的资源嵌套进 companies。

ActionController::Routing::Routes.draw do |map|
  map.resources :companies do |company|
    company.resources :divisions
  end
end

这次,表示 ID 99 的 Division 对象的 URL 路径变成 /companies/123/divisions/99 ,生成的这个 URL 路径的辅助方法被定义为company_division_path(company, division)

并且,属于 ID 123 中 Company 对象的 Division 对象,其一览页面的 URL 路径变成 /companies/123/divisions ,生成的这个 URL 路径的辅助方法 company_divisions_path(company) 被定义。

这不就好像是一个智力游戏吗?

要理解这样复杂的构造真是让人费心,这样的话我们还要向REST 的世界进军吗?

如果让我先说的话,我会说“当然要进军”,关于理由我会另外找机会说明。
--
黒田努

(2008/04/24)