Нет ошибки метода в UsersController

Я начал программировать на Rails несколько недель назад и не могу понять, почему у меня возникает эта ошибка. Я использую Devise для входа в систему и Formtastic для форм. Приложение работало правильно, пока я не добавил Acts_like_tags_on и не сбросил базу данных.

Сообщение об ошибке: NoMethodError в UsersController#show

undefined method `username' for nil:NilClass

app/controllers/users_controller.rb:19:in `show'
Request

Parameters:
{"id"=>"sign_in"}

Это то, что у меня есть в контроллере пользователей:

def show
 @user = User.find_by_username(params[:id])
 @title = @user.username

 respond_to do |format|
   format.html # show.html.erb
   format.json { render json: @user }
 end
end

Любой вклад будет полезен. Спасибо!

После редактирования @user = User.find_by_username(params[:id]) на: @user = User.find_by_user(params[:id])

Ошибка становится: неопределенный метод `find_by_user' для #

Столбец имени пользователя существует в таблице пользователей.


person pooroldflick    schedule 21.06.2011    source источник


Ответы (4)


На самом деле это проблема маршрутизации

Проблема в том, что devise ожидает, что у вас будет маршрут, который повернет:

"/users/sign_in" в сеансы#new

но в вашем файле маршрутов отсутствует этот маршрут, поэтому диспетчер сопоставляется с:

Маршрут «users/:id», который затем переходит к: users#show with :id => 'sign_in'

(и, следовательно, выдает ошибку, когда пытается найти пользователя с идентификатором «sign_in»)

Вам нужно прочитать документ README для разработки (погуглите, если у вас его нет локально) - особенно ту часть, которая описывает, как добавить стандартный набор маршрутов в config/routes.rb. Затем делайте все, что он говорит. :)

Должно быть сразу после этого.

person Taryn East    schedule 21.06.2011
comment
Это решило проблему, Тарин. Спасибо! Я читал что-то из README, но пропустил маршрутизацию. После того, как я добавил следующую строку в свои маршруты, sign_up (и т. д.) теперь находится в account/sign_up и больше не сбивает с толку «sign_up» как пользователя: devise_for :users, :path =› account, :path_names =› { :sign_in =› 'логин', :sign_out =› 'выход', :password =› 'секрет', :confirmation =› 'подтверждение', :unlock =› 'разблокировать', :registration =› 'зарегистрироваться', :sign_up =› 'sign_up' } - person pooroldflick; 21.06.2011
comment
Ура. Я сам попался на этом... приятно видеть, что мой собственный опыт в этом может помочь кому-то еще :) - person Taryn East; 21.06.2011

@user = User.find_by_username(params[:id])

Эта строка выше может возвращать ноль. Если вы выполните User.find_by_username("Superman-is-awesome") и этого имени пользователя нет в вашей базе данных, он вернет nil.

Затем он пытается сделать:

@title = @user.username

Что по сути:

@title = nil.username

Что, конечно, не сработает. Так что может быть что-то не так с параметром, который вы передаете.

Кроме того, убедитесь, что в вашей таблице пользователей есть столбец с именем «имя пользователя»? Убедитесь, что вы выполнили:

rake db:migrate

Также.

person ardavis    schedule 21.06.2011
comment
В этом есть смысл. Я изменил строку на: @user = User.find_by_user(params[:id]) Теперь ошибка: неопределенный метод `find_by_user' для #‹Class:0x0000000464f128› - person pooroldflick; 21.06.2011
comment
Вместо find_by_user это будет просто find(params[:id]) Все, что вам нужно сделать, чтобы найти пользователя, это передать идентификатор. - person ardavis; 21.06.2011
comment
Спасибо за отзыв. Я поставил: @user = User.find(params[:id]) и теперь я получаю это: ActiveRecord::RecordNotFound в UsersController#show Не удалось найти пользователя с ID=sign_up - person pooroldflick; 21.06.2011
comment
Похоже, вы пытаетесь получить доступ к yoursite.com/users/sign_up, но он ищет пользователя с идентификатором sign_up. Вы используете Девиза? Если это так, установите его с помощью «rails g devise: install», затем выполните «rails g devise User». Возможно, вам потребуется удалить предыдущую миграцию create_user в файле db/migrations. И добавьте свои настраиваемые поля (если есть) в новую пользовательскую таблицу с помощью новых миграций. Убедитесь, что в вашем файле маршрутов есть «devise_for: пользователи» и «ресурсы: пользователи». Тогда все должно быть хорошо. Посмотрите Railscasts Райана Бейтса. Перейдите на railscasts.com и выполните поиск "Devise". Есть два. - person ardavis; 21.06.2011
comment
Да, я использую Devise. Он работал очень хорошо, пока я не установил Acts_like_tags_on, поэтому мне интересно, вызвало ли это проблему (я сбросил базу данных). Еще раз спасибо за ваш вклад! - person pooroldflick; 21.06.2011
comment
Хм... Я использую act_as_taggable_on. Я получил это отсюда: github.com/mbleigh/acts-as-taggable-on Инструкции были довольно хорошими, и у меня не возникло никаких проблем. - person ardavis; 21.06.2011
comment
Подожди, ты прав. Это жемчужина, которую я установил (пару часов смотрел на экран, пытаясь понять это). :) - person pooroldflick; 21.06.2011
comment
Что ж, я очень рад, что смог тебе помочь. Мне очень понравилось работать с вами. Просто не забудьте отметить правильный ответ на все ваши вопросы. Хорошего дня! - person ardavis; 21.06.2011
comment
Я снова прошел настройку Devise (спасибо за видеоподсказку) и добавил имя пользователя в User (я сбросил базу данных и удалил файлы миграции). У меня все еще та же ошибка, что и раньше. :( - person pooroldflick; 21.06.2011
comment
Я думаю, что происходит то, что он берет пользователей/sign_up и ищет пользователя с идентификатором sign_up вместо того, чтобы перенаправлять меня на страницу sign_up (рейк-маршруты показывают, что путь существует). - person pooroldflick; 21.06.2011
comment
Итак, после комментирования ресурсов :users страница sign_up стала доступной. Но после регистрации я увидел это на своем сервере: ВЫБЕРИТЕ пользователей. * ОТ пользователей, ГДЕ users.id = 0 LIMIT 1 Completed 404 Not Found in 171ms ActiveRecord::RecordNotFound (не удалось найти пользователя с ID=users): app/ контроллеры/users_controller.rb:17:в `показать' - person pooroldflick; 21.06.2011
comment
Убедитесь, что у вас есть ОБА: 'devise_for:users' И 'resources:users'. devise_for :users позволяет работать /users/sign_in и /users/sign_out. Затем ресурсы :users позволяют работать таким вещам, как /users/1 или /users/1/edit и т. д. - person ardavis; 21.06.2011

Если вы правильно настроили маршруты, вы должны разработать маршруты ДО пользовательского ресурса, например:

devise_for :users
resources :users, except: "create"
person mir    schedule 03.04.2012

Я обнаружил, что user_id получает значение «пользователи». После комментирования следующей строки в файле route.rb идентификатору больше не присваивалось это значение.

match '/:id' => 'users#show', :as => :user

Мне также нужно, чтобы в user_controllers #show была следующая строка, так как мой путь пользователя использует имя пользователя. удаление '_by_username' вызвало ошибку на страницах, которые запрашивали имя пользователя:

@user = User.find_by_username(params[:id])
person pooroldflick    schedule 21.06.2011