几个星期前我开始在Rails中编码,我无法弄清楚为什么会出现这个错误。我正在使用Devise进行登录,使用Formtastic进行表单。该应用程序正常工作,直到我添加Acts_like_tags_on并重置数据库。
错误讯息: UsersController中的NoMethodError#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'用户名列确实存在于用户表中。
答案 0 :(得分: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
同样。
答案 1 :(得分:1)
如果您正确配置了路由,则应该在用户资源之前设置路由,如下所示:
devise_for :users
resources :users, except: "create"
答案 2 :(得分:0)
我发现user_id被赋予'users'的值。在我的routes.rb中注释掉以下行后,id不再被赋予该值。
match '/:id' => 'users#show', :as => :user
我还需要users_controllers #show包含以下行,因为我的用户路径使用用户名。删除'_by_username'会在调用用户名的页面上导致错误:
@user = User.find_by_username(params[:id])
答案 3 :(得分:0)
这实际上是路由问题
问题是设计期望你有一条转向的路线:
“/ users / sign_in”进入会话#new
但您的路由文件缺少该路由,因此调度程序与:
匹配“users /:id”路由然后转到: 用户#show with:id => 'sign_in'
(因此在尝试查找ID为“sign_in”的用户时会抛出错误)
您需要阅读设计的README文档(如果您没有在本地使用google) - 尤其是描述如何将标准路由集添加到config / routes.rb的部分然后执行它所说的任何内容。 :)
应该在那之后。