Rails Routes – 斜杠字符与哈希字符

在URL和rails路由中,使用斜杠字符与井号(井号)字符有什么区别?

这些工作

get "/static_pages/about" get 'about', to: 'static_pages#about', as: :about 

这些没有

 get "/static_pages#about" get 'about', to: 'static_pages/about', as: :about get 'about', to: '/static_pages#about', as: :about 

什么代码控制这种行为,背后的深层原因是什么?

回答:

(这两个人回答得非常好,我很难选择哪一个标记为接受的答案。我希望以一种可能有助于人们的不同方式表明我对答案的理解。)

使用/符号后,字符串将被识别为附加到基本URL的URL字符串。 所以’#’字符将被解释为url的一部分,而url不喜欢使用’#’字符。

在不使用/字符的情况下,第一个单词以某种方式被识别为控制器名称,您可以使用“#”和操作名称进行跟进。

to: 'static_pages#about'表示static_pages_controller 。 语法是controller#action

当你定义get "/static_pages#about"static_pages#about成为路由的控制器,即#只是一个字符文字而#about并不意味着操作。 如果static_pages#about controller不存在,则应该missing :controller错误。

以下路由定义为您提供/about映射到static_pages/about控制器about操作的路径,其中static_pages可以是命名空间或范围。

 get 'about', to: 'static_pages/about', as: :about 

以下路由无效,并且由于前导斜杠/输入选项而应该抛出错误。

 get 'about', to: '/static_pages#about', as: :about 

在ruby中,哈希符号通常位于类的实例方法的名称之前。 请参阅Array类文档( http://www.ruby-doc.org/core-2.1.0/Array.html )页面的左侧边栏。

get "/static_pages#about"不起作用,因为#about不是url的一部分。

get 'about', to: 'static_pages/about', as: :about不起作用,因为/about不指示应该调用哪个控制器方法。

get 'about', to: '/static_pages#about', as: :about因为static_pages之前的斜杠而无效。