Ошибка метода в UsersController - PullRequest
2 голосов
/ 21 июня 2011

Я начал кодировать в 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 для #

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

Ответы [ 4 ]

2 голосов
/ 21 июня 2011
@user = User.find_by_username(params[:id])

Эта строка выше может возвращать ноль.Если вы используете User.find_by_username («Супермен-это-удивительный»), а это имя пользователя не существует в вашей базе данных, оно вернет nil.

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

@title = @user.username

Что по сути:

@title = nil.username

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

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

rake db:migrate

.

1 голос
/ 03 апреля 2012

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

devise_for :users
resources :users, except: "create"
0 голосов
/ 21 июня 2011

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

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

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

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

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

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

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

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

0 голосов
/ 21 июня 2011

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

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

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

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