2016-01-22 3 views
0

Я хочу, чтобы у пользователя была собственная страница,/users/52. Поэтому я добавил новый контроллер, чтобы это произошло, контроллер - user_controller.rb. Но теперь другие функции не работают.Devise - ActiveRecord :: RecordNotFound

Когда у меня есть маршруты, как показано ниже./Users/sign_in не работает. Но работает/users/1.

#Users/show!!! 
    match 'users/:id' => 'users#show', via: :get 
    # or 
    get 'users/:id' => 'users#show' 
    # or 
    resources :users 

    devise_for :users, controllers: { 
      sessions: 'users/sessions' 
    } 

При использовании маршрутов, как показано ниже. Работа/users/1 dosen't работает, но пользователи/sign_in работают.


 

 
    devise_for :users, controllers: { 
 
      sessions: 'users/sessions' 
 
    }

class UsersController < ApplicationController 
 

 
#def show 
 
# \t @user = User.friendly.find(params[:id]) 
 
# \t @links = Link.all.where(user_id: @user).publish 
 
#end 
 

 
def index 
 
\t @users = User.all 
 
end 
 

 
def show 
 

 
\t @user = User.friendly.find(params[:id]) 
 
\t @links = Link.all.where(user_id: @user).publish 
 
end 
 

 
def new 
 
\t 
 
end 
 

 

 

 
end

+0

Создал ли пользователь, с которым вы пытаетесь войти, ошибка означает, что что-то не найдено в базе данных (скорее всего, пользователь) – bjhaid

+0

Пользователь создан. Поскольку я могу войти на сайт, если я удалю эти строки: сопоставьте «users /: id» => «users # show», через:: get # или get 'users /: id' => 'users # show' # или Ресурсы: пользователи – VictorBlomberg

+0

Вы пытались использовать ресурсы: пользователи, только: [: show] '? Я боюсь, что другие варианты не будут работать, потому что действие над проектом будет интерпретироваться как идентификатор (т. Е. В '/ users/sign_in', новый будет передан вашему UserController как' id: 'sign_in''). Кроме того, если вы не ограничиваете 'resources'': show', он может маскировать маршруты разработки. – taglia

ответ

0

Я думаю, вам просто нужно переместить resources :users (или другие варианты, которые у вас есть) ПОСЛЕ объявления разработчика. Сопоставления, которые приходят первыми, имеют приоритет в файле маршрутов, поэтому все запросы типа «пользователи/все» будут соответствовать вашим пользователям. # Show action и никогда не добираться до контроллеров разработки. Пройдемся через пример:

Когда пользователь пытается посетить users/sign_in, рельсы начинается соответствующий путь с отображениями в файле маршрутов, сверху вниз, и когда она достигает users/:id, она принимает «sign_in» подразумевается значение для :id (так как структура пути соответствует), поэтому он выбирает действие users#show, и если вы посмотрите на параметры в действии show, вы увидите, что id дал значение «sign_in».

Если поставить users/:id отображения после devise_for блока, то входные пути сначала будут соответствовать более строгому отображению (например, только путь users/sign_in будет соответствовать отображению users/sign_in), а затем шире users/:id

Таким образом, в краткое:

devise_for :users, controllers: { 
     sessions: 'users/sessions' 
} 
resources :users 

Будет работать.

+0

Большое вам спасибо.так просто... – VictorBlomberg

0

То, что происходит в том, что при запросе "пользователи/sing_in" контроллер ищет запись с идентификатором "sign_in", такая запись Безразлично» t существует, следовательно, activerecord не обнаружил ошибку.

Вы должны поместить получить 'пользователей /: идентификатор' => 'пользователи # шоу' после "devise_for" блока и не раньше.