【问题标题】:Understanding what's going on with : and # in ruby, rails routes了解 : 和 # 在 ruby​​、rails 路由中发生了什么
【发布时间】:2013-09-23 15:37:56
【问题描述】:

在这个关于设计路线的问题的答案中:Devise & Custom Rails User URLs 有一行代码:

match '/:user' => "users#show", :as => :user_profile

这显然适用于提问者,但不适用于我。我最终得到了

NoMethodError in UsersController#show
undefined method `books' for nil:NilClass

当我转到 localhost:3000/username 而不是 localhost:3000/user/username 时。根据我的路由文件,我认为是因为上面的 match 行无法正常工作,并且该 url 没有引用任何用户。

第二个 url 将我引导到用户的 show 页面,但我不希望 url 中出现额外的 /user

所以我想弄清楚 '/:user':as:user_profile 到底是什么意思,因为我认为我应该在这里替换一些特定于我的应用程序的东西。我认为 :as 是某种别名方法。我在设计文档中找不到关于名为 user_profile 的路由的任何内容。而且我不知道 '/:user' 指的是什么。用户对象的实例?我用来指代特定用户的数据库中的用户属性/唯一列? (我使用 permalink 作为我的用户定义的 url)。

【问题讨论】:

  • 请发布您的 routes.rb 文件以及您的 UsersController。
  • 问题是我使用的是 {match '/:permalink' => "users#show", :as => :user_profile} 而不是 {match '/:id' => "users #show", :as => :user_profile}。所以,至少它有效,但不幸的是我无法向任何人解释为什么它有效。

标签: ruby-on-rails hash devise routes symbols


【解决方案1】:

这条路线适合你。这就是为什么你得到错误from users_controller#show

在您的表演动作中,您必须执行类似 User.where(:id => params[:id]) 的操作。但在这种情况下,参数中的属性称为 :user 。因此,要使两条路线都能正常工作,而不需要更改 show 操作,请将路线更改为

match '/:id' => "users#show", :as => :user_profile

【讨论】:

  • 就是这样!愚蠢的我,我使用的是 {match '/:permalink' => "users#show", :as => :user_profile}。不知道为什么我没有尝试 {:id}。
【解决方案2】:

设计文档不会引用“user_profile”,因为它是用于帮助解决提问者(在链接问题中)提出的问题的自定义路由。

match '/:user' => "users#show" 的意思是“在/ 之后匹配与先前定义的路由不匹配的单个参数的任何路由,将此路由与UsersController 'show' 操作配对(将单个参数作为'user' 传递) "

使用:as => :anything 修改路由将提供几个帮助方法来引用此路由,这些方法可用于控制器、视图和邮件程序(在本例中为anything_pathanything_url)。

至于为什么这对您不起作用,这很可能与此条目有关您的其余路线或由于您的控制器操作本身存在问题。发布这些可以帮助某人找到确切的原因...

【讨论】:

  • 谢谢!我认为 user_profile 是我应该弥补的路线,而不是 Devise 提供的路线,但我不确定。
猜你喜欢
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
相关资源
最近更新 更多