1

我有一个带有用户控制器的应用程序,我希望将它作为我的路由中的顶级路径,例如:

get ':id' => 'users#show', as: :user_profile

我的to_param方法User是:

def to_param
  self.username
end

因此,例如,当您点击“/rodrigo”时,它将查找User用户名为“rodrigo”的对象。到现在为止还挺好。

但我也有一些静态页面,我也想拥有顶级路径,例如 about、terms、

controller :home do
  get 'about',       to: :about,    as: 'about'
  get 'help',       to: :help,     as: 'help'
  get 'terms',      to: :terms,    as: 'terms'
  get 'privacy', to: :privacy,  as: 'privacy'
end

发生的情况是,当我尝试访问这些静态页面中的任何一个时,我得到:

NoMethodError in Users#show
Showing /Users/rodrigovieira/Code/golaco/app/views/users/show.html.erb where line #1 raised:

 undefined method `name' for nil:NilClass

另外,我的users#show路由是在静态页面路由之前定义的routes.rb

也就是说,Rails 认为我在谈论用户对象。我该如何规避这个问题?

我很确定这是可能的。我很感激任何帮助。

4

1 回答 1

3

Rails 路由按照指定的顺序进行匹配,因此如果您在 get 'photos/poll' 上方有一个资源 :photos,则资源行的 show action 路由将在 get 行之前匹配。要解决此问题,请将 get 行移到资源行上方,以便首先匹配。

Golaco::Application.routes.draw do
  # Institutional/Static pages 
  controller :home do
    get 'about', to: :about, as: 'about'
    get 'help', to: :help, as: 'help'
    get 'terms', to: :terms, as: 'terms'
    get 'privacy', to: :privacy, as: 'privacy'
  end
  get ':id' => 'users#show', as: :user_profile 
  resources :users, path: "/", only: [:edit, :update] 
  devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' } 
  root 'home#index' 
end
于 2013-11-10T14:11:41.097 回答