Rails的默认restful资源代码背后的逻辑是什么?

时间:2013-02-18 18:43:19

标签: ruby-on-rails architecture routing naming-conventions

我正在学习Rails。很多惯例都很有意义。映射到控制器操作的代码约定是奇数:

//code                  url               controller action
tweets_path             /tweets/          def index
tweet                   /tweet/ID         def show
new_tweet_path          /tweets/new       def new
edit_tweet_path(tweet)  /tweets/ID/edit   def edit

为什么自动生成的方法助手不是以与控制器操作相同的对称方式完成的?例如:

//code
tweet_index
tweet_show(tweet)
tweet_new
tweet_edit(tweet)

我很新,我确信这是一个很好的理由,我还不知道:)

3 个答案:

答案 0 :(得分:1)

这里有两个不对称。

第一个是复数与单数路线助手。为什么有些助手tweets_*是助手,有些是tweet_*助手?

答案是某些资源路由是成员路由,而其他路由是集合路由。成员路由与资源实例有关,而集合路由与作为组的资源的所有实例有关(除非资源是单数的,在这种情况下没有收集路由)。索引操作是集合路由,show动作是成员路由。

您可以声明自己的成员和收集路线,如下所示:

# routes.rb
resources :tweets do
  member do
    get :duplicate
  end
  collection do
    get :summarize
  end
end

除了标准的助手之外,这将创建两个助手。请注意,Rails将创建适当的单数或复数的路径助手。

  1. 不带参数的summarize_tweets_path助手
  2. 一个duplicate_tweet_path帮助
  3. 官方文档为here

    第二种不对称性是,许多内置资源操作都会将操作排除在帮助程序之外。我想这可能是为了简洁,但我真的不知道。

    修改

    在考虑之后,由于Rails和REST中存在路径重载,因此删除了操作名称。 '/ tweet /:id'路径可以是显示,更新或删除操作,具体取决于HTTP谓词。基本上,路径会告诉您正在操作的内容,而不是采取的操作。

答案 1 :(得分:1)

辅助方法的生成方式使它们更像句子的一部分,使它们更具可读性。说“创建新推文的链接”听起来比“创建新推文链接”听起来更好。在命名任何自定义动作时,记住这一点也很有帮助,使用符合句子的名称可以更容易理解和记忆,因为这是我们学会说话的方式。

答案 2 :(得分:0)

不对称的一个原因是映射依赖于HTTP操作。例如,GET to / tweets映射到索引操作,但POST到/ tweets映射到create操作。