【问题标题】:RoR - NoMethodError, undefined methodRoR - NoMethodError,未定义的方法
【发布时间】:2015-06-28 09:41:07
【问题描述】:

我创建了一个具有简单登录身份验证的应用程序,它实际上是一个 twitter 克隆。用户登录并访问页面等。

但是当用户从那里发布一些个人资料时。它给出了一个错误

NoMethodError in RibbitsController#create
undefined method `id=' for nil:NilClass

错误在第 5 行左右:

class RibbitsController < ApplicationController

 def create
   @ribbit = Ribbit.create(user_ribbits)
   @ribbit.userid = current_user.id

   if @ribbit.save
       redirect_to current_user 
   else
       flash[:error] = "Problem!"
       redirect_to current_user
   end
 end

 private

 def user_ribbits
      params.require(:ribbit).permit(:content, :userid)
    end
end

给应用的请求:

Request

参数:

{"utf8"=>"✓",
 "authenticity_token"=>"dwVmjDNO4GOowphGFgChMDBxBfvka+M/xSUHvJMECzwxtv4NF6OuWtiaX74NLz91OwQJ9T9+wm7yMiPQ0BLpGA==",
 "ribbit"=>{"content"=>"hi. test.\r\n"},
 "commit"=>"Ribbit!"}

会话控制器:

class SessionsController < ApplicationController

  def new
  end

  def create
   user = User.find_by_username(params[:username])
    if user && user.authenticate(params[:password])
        session[:userid] = user.id
        redirect_to rooturl, notice: "Logged in!"
    else
        flash[:error] = "Wrong Username or Password."
        redirect_to root_url
    end
  end

  def destroy
   session[:userid] = nil
    redirect_to root_url, notice: "Logged out."
  end

end

用户控制器:

class UsersController < ApplicationController

 def new
     @user = User.new
 end

 def create
   @user = User.create(user_params)

   if @user.save
    session[:user_id] = @user.id
     redirect_to @user, notice: "Thank you for signing up!"
   else
     render 'new'
   end
 end

 def show
   @user = User.find(params[:id])
   @ribbit = Ribbit.new
 end

 private

 def user_params
      params.require(:user).permit(:name, :username, :email, :password, :password_confirmation, :avatar_url)
    end

end

还有应用程序控制器

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  private

 def current_user
   @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end

  helper_method :current_user
end

如果你们能提供帮助,我将不胜感激!

谢谢。

【问题讨论】:

  • 你确定你的Ribbit 被拯救了吗?
  • 不确定是不是这个原因,但您同时使用了:userid:user_id。可能想坚持user_id,因为使用这种外键名很常规
  • 尝试将调试器放在RibbitsContollercreate 操作中,看看你是否在那里得到current_user
  • 另外,你确定你给出了正确的错误信息吗?您正在尝试调用 userid= 方法而不是 id=
  • 我认为,session[:user_id] 没有定义

标签: ruby-on-rails ruby methods


【解决方案1】:

您正在尝试将 current_user.id 分配给 @ribbit.userid 而不确保已设置 current_user。 'current_user' 仅在用户之前保存过时才会设置。

因此,您需要确保经过身份验证的用户正在尝试创建Ribbit,或者如果您将userid 视为非必填字段,您只需将第5 行更改为:

@ribbit.userid = current_user.id unless current_user.blank?

如果您只希望经过身份验证的用户创建 Ribbit,请考虑使用 gem 来处理身份验证,例如 Devise。然后,您可以在控制器中使用 before_filter :authenticate_user! 来确保用户得到正确的身份验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 2019-06-12
    相关资源
    最近更新 更多