1

私はユーザーコントローラーを備えたアプリを持っており、次のようにルートのトップレベルパスとして使用したいと考えています。

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

私のto_param方法Userは次のとおりです。

def to_param
  self.username
end

たとえば、「/rodrigo」を押すUserと、ユーザー名が「rodrigo」のオブジェクトが検索されます。ここまでは順調ですね。

しかし、トップレベルのパスも含めたい静的ページもいくつかあります。たとえば、約、用語、

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' の上に resources :photos がある場合、resources 行の show アクションのルートは get 行の前に照合されます。これを修正するには、最初に一致するように get 行を resources 行の上に移動します。

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 に答える