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 페이지 외에, 나는 예를 about 페이지 static controller 아래 페이지를 가지고있다. 나는 여기에 내가 정의하는 방법이다, www.website.com/about처럼 액세스 할 수있게하려면 내 static routes : 이제

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

, 내가 about page로 리디렉션하려고하면, 나는 오류가 점점 오전 :

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

귀하의 경로 '수'/ 정보 '에 : /'정적 #의 about''은'도착하기 전에 정의되어야한다 'ID'=> '사용자 # 쇼'로 : : profile' route – lightalloy

+3

정적 페이지 호출에서 사용자 호출 및 문자의 숫자를 예상한다고 가정하면 제약 조건을 사용할 수 있습니다. http://guides.rubyonrails.org/routing.html#specifying-constraints –

+1

@lightalloy 처음 생각했습니다. 저자가 썼 듯이 정적 페이지 컨트롤러를 호출하기 때문에 작동하지 않습니다. –

답변

3

두 가지 :

  • 경로는
  • 루트는이 경우 바닥

위에서 일치 PARAM 유형의 무지, 나는 당신의 단일 레벨 노선이 정의되고 있음을 의심하여 get '/:id' 경로. 따라서 해당 경로는 라우터가 anything을 매개 변수라고 생각하기 때문에 /anything 인 모든 요청을 포착합니다.

경로 정의를 다른 /about 경로 아래로 이동하여 먼저 일치시킵니다. 이처럼

:

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

Daniel 대단히 감사합니다. 저에게 도움이됩니다. –

+0

은 코드 예제를 추가했으며 @AnthonyBrooks는 사용자가 정의 된 경로와 동일한 ID/슬러그/이름을 가지지 않도록 유효성 검사를 추가해야 함을 알고 있습니다. 이것은 사용자 좌절감을 막을 것입니다. (누군가가 'about'을 사용자 이름으로 넣으려고 시도 할 때를 대비해) –

+0

@RudolfOlah 와우, 나는 그것에 대해 생각하지 않았습니다 ... 좋은 지적입니다! 고마워요! –