2017-12-13 24 views
1

私はDevise gemと協力しており、ユーザーのためにshowページを作成しました。私の考えはwww.website.com/:idのような単純なパスを作ることだったと下図のように、私はそれを構成し:Ruby on Railsでの経路競合

devise_for :users, path: '', path_names: {sing_in: "login", sing_out: 
    "signout", sing_up: "signup", edit: "edit"}, 
    :controllers => {:registrations => :registrations } 
    resources :users, only: [:show] 
    get '/:id' => 'users#show', as: :profile 

私のルートは正常に動作しますがshowページ以外にも、私は、例えばstatic controller下のページaboutページを持っています。私はwww.website.com/aboutのようにアクセスできるようにしたい、ここで私は私のstatic routesを定義する方法である:私はabout pageにリダイレクトしようとしていた場合

get '/about', to: 'static#about' 

今、私はエラーを取得しています:

ActiveRecord::RecordNotFound in UsersController#show 
Couldn't find User with 'id'=about 

ここに私のusers_controller.rbです:

class UsersController < ApplicationController 

    def show 
    @user = User.find_by_id(params[:id]) 
    @services = @user.services 
    end 

    ... 
end 

私は、同様のエラーを検索しようとしましたが、このようなものを発見していません。誰かが私が間違っていることを教えてもらえますか?

ご協力いただきありがとうございます。ここ

+4

あなたのルート ' 'について/' を取得、に:として、ID '=> 'ユーザーの#ショー':/「静的#1 about''は'得る前に定義する必要があります' ::profile' route – lightalloy

+3

静的なページ呼び出しでユーザーの電話と文字の数字が来ると想定すると、制約を使うことができます:http://guides.rubyonrails.org/routing.html#specifying-constraints –

+1

@lightalloyこれは私の最初の考えでした著者が書いたように、実際には静的ページコントローラを呼び出すため、動作しません。 –

答えて

3

2つのこと:

  • ルートが
  • ルートはこの場合下

にトップ一致しているのparamタイプの知らない、私はあなたの単一レベルのルートが定義されていることを疑うあなたget '/:id'ルート。したがって、そのルートは/anythingのすべての要求をキャッチしています。ルータはanythingをパラメータと考えているためです。

他の​​などのルートの下にあるルート定義を最初に一致させるように移動するだけです。

このよう

get '/about', to: 'static#about' 
get '/:id' => 'users#show', as: :profile 
+0

Danielさん、ありがとう、ありがとうございました。 –

+0

にコード例が追加されました。また、@AnthonyBrooksは、ユーザーが定義されたルートと同じID/slug/nameを持つのを防ぐために検証を追加する必要があることを認識しておくとよいでしょう。これはユーザーの欲求不満を防ぎます(誰かが自分のユーザー名として「約」を入れようとしている場合にのみ) –

+0

@RudolfOlahうわー、私はそれについて考えなかった...良い点!どうもありがとうございました! –