UsersController中没有Method错误

时间:2011-06-21 02:01:44

标签: ruby-on-rails nomethoderror

几个星期前我开始在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'

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

4 个答案:

答案 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的部分然后执行它所说的任何内容。 :)

应该在那之后。