2

几周前我开始在 Rails 中编码,但我不知道为什么会出现这个错误。我使用 Devise 进行登录,使用 Formtastic 进行表单。该应用程序正常工作,直到我添加 Acts_like_tags_on 并重置数据库。

错误消息:UsersController#show 中的 NoMethodError

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])

错误变成:undefined method `find_by_user' for #

用户表中确实存在用户名列。

4

4 回答 4

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

上面的那行可能返回零。如果您执行 User.find_by_username("Superman-is-awesome") 并且该用户名在您的数据库中不存在,它将返回 nil。

然后它试图做:

@title = @user.username

本质上是:

@title = nil.username

这当然行不通。所以你传入的参数可能有问题。

另外,请确保您的用户表有一个名为“用户名”的列?确保您已运行:

rake db:migrate

同样。

于 2011-06-21T02:31:56.463 回答
1

如果您正确配置了路由,您应该在用户资源之前设计路由,如下所示:

devise_for :users
resources :users, except: "create"
于 2012-04-03T16:32:59.507 回答
0

我发现 user_id 被赋予了“用户”的值。在我的 routes.rb 中注释掉以下行后,id 不再被赋予该值。

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

我还需要 users_controllers #show 具有以下行,因为我的用户路径使用用户名。删除 '_by_username' 会在需要用户名的页面上导致错误:

@user = User.find_by_username(params[:id])
于 2011-06-21T13:50:13.857 回答
0

这实际上是一个路由问题

问题是设计希望你有一条会转弯的路线:

“/users/sign_in”进入会话#new

但是您的路线文件缺少该路线,因此调度程序与以下内容匹配:

"users/:id" 路由,然后转到:users#show with :id => 'sign_in'

(因此当它尝试查找 ID 为“sign_in”的用户时会引发错误)

您需要阅读 README 文档以进行设计(如果您在本地没有它,请使用 google) - 特别是描述如何将标准路由集添加到 config/routes.rb 的部分,然后按照它说的去做。:)

应该是在那之后。

于 2011-06-21T14:27:59.207 回答