0

我正在学习 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)

我很新,我敢肯定有一个很好的理由,我只是还不知道:)

4

3 回答 3

1

这里有两个不对称。

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

答案是有些资源路由是成员路由,有些是集合路由。成员路由与资源的一个实例有关,而收集路由与作为一个组的资源的所有实例有关(除非资源是单一的,在这种情况下没有收集路由)。index 动作是一个集合路由,而 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帮手

官方文档在这里

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

编辑

想了想,因为 Rails 和 REST 中存在路径重载,所以去掉了 action 名称。'/tweet/:id' 路径可以是显示、更新或删除操作,具体取决于 HTTP 动词。基本上,路径告诉您您正在操作什么,但不告诉您要采取什么行动。

于 2013-02-18T19:41:31.890 回答
1

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

于 2013-02-18T20:01:00.457 回答
0

它不对称的一个原因是映射取决于 HTTP 操作。例如,到 /tweets 的 GET 映射到 index 操作,但到 /tweets 的 POST 映射到 create 操作。

于 2013-02-18T18:49:45.143 回答