【问题标题】:No Method error in UsersController用户控制器中没有方法错误
【发布时间】:2011-06-21 02:01:43
【问题描述】:

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

错误信息: 用户控制器中的 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”

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

【问题讨论】:

    标签: ruby-on-rails nomethoderror


    【解决方案1】:
    @user = User.find_by_username(params[:id])
    

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

    然后它正在尝试做:

    @title = @user.username
    

    本质上是:

    @title = nil.username
    

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

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

    rake db:migrate
    

    也是。

    【讨论】:

    • 这是有道理的。我将行更改为:@user = User.find_by_user(params[:id]) 现在错误是:#<0x0000000464f128>
    【解决方案2】:

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

    devise_for :users
    resources :users, except: "create"
    

    【讨论】:

      【解决方案3】:

      这其实是一个路由问题

      问题是 devise 期望你有一条会转弯的路线:

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

      但是您的路由文件缺少该路由,因此调度程序正在匹配:

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

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

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

      应该在那之后。

      【讨论】:

      • 解决了,Taryn。谢谢!我一直在阅读自述文件中的内容,但忽略了路由。在我的路由中添加以下行后,sign_up(等)现在位于 account/sign_up 中,并且不再将 'sign_up' 作为用户混淆:devise_for :users, :path => "account", :path_names = > { :sign_in => 'login', :sign_out => 'logout', :password => 'secret', :confirmation => 'verification', :unlock => 'unblock', :registration => 'register', :sign_up => 'sign_up' }
      • 是的。我自己被这个抓住了......很高兴看到我自己的经验可以帮助其他人:)
      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-19
        • 1970-01-01
        • 1970-01-01
        • 2019-01-05
        • 1970-01-01
        相关资源
        最近更新 更多