2013-02-18 51 views
0

我是Learning Rails。许多公约很有意义。映射到控制器动作的代码的惯例是奇数:Rails默认的restful资源代码背后的逻辑是什么?

//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) 

我很新的我敢肯定有一个非常好的理由,我只是不知道它:)它不是对称

+0

不错的问题,我认为这只是一个惯例..我喜欢“tweets_path”的声音,我希望看到这条路线中的所有推文,这就是默认显示的内容。 :) – Kaeros 2013-02-18 18:49:31

+0

我发现这个,它_almost_解释了为什么:https://blogs.oracle.com/divas/entry/restful_rails_tutorial – SimplGy 2013-02-18 18:53:57

回答

1

这里有两种不对称。

首先是复数与单数路线助手。为什么有些帮手tweets_*帮手,而其他人是tweet_*帮手?

答案是某些资源路由是成员路由和其他是集合路由。成员路由必须处理一个资源实例,并且集合路由必须将资源的所有实例作为一个组处理(除非资源在单个情况下不存在收集路由)。索引操作是集合路由,并且显示操作是成员路由。

您可以声明自己的成员和收集路线是这样的:

# 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帮手,做

官方的文档here

第二个不对称的行动留出了帮手的许多内置资源的行动。我想这可能是为了简洁,但我不知道。

编辑

考虑这件事后,行动名字下降了,因为有路径Rails和REST超载。根据HTTP动词,'/ tweet /:id'路径可以是显示,更新或删除操作。基本上,路径告诉你你正在操作什么,但不知道要采取什么行动。

+0

多元映射到成员VS集合是很有意义的。我爱这个约定。 – SimplGy 2013-02-18 19:45:46

0

一个原因是,映射取决于在HTTP动作上。例如,一个GET to/tweets映射到索引操作,但POST/tweets映射到create操作。

1

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

+0

我忘记了Ruby哲学的这个重要部分。好点子。 – SimplGy 2013-02-18 20:06:17