nil的未定义方法`id':find_by上的NilClass

时间:2014-05-22 18:04:12

标签: ruby-on-rails-4

我的控制器出了问题。

当我尝试添加播放器时,我首先找到要与播放器关联的用户,但是当此电子邮件未注册时,我收到此错误:

undefined method `id' for nil:NilClass

我尝试使用.nil?,。blank?但是我总是无法检测到nil变量而且我不知道为什么。

这是我的控制器:

  def create
    if user_signed_in?
      @player = Player.new
      @user_ref = User.find_by_email(params[:new_player][:email])
      if @user_ref.blank?
        flash[:errors] = []
        flash[:errors] << {:message => "Adresse email introuvable", :strong => 'Erreur :'}

        redirect_to new_club_team_player_path
      end
      @player.user_id = @user_ref.id
      @player.position_id = params[:new_player][:position_id]

      if @player.save
        redirect_to club_team_player_path(params[:club_id], params[:team_id], @player)
      else
        flash[:errors] = []
        flash[:errors] << {:message => "Une erreur est survenu lors de l'enregistrement de ce joueur", :strong => 'Erreur :'}

        redirect_to new_club_team_player_path
      end
    else
      flash[:errors] = []
      flash[:errors] << {:message => 'Vous devez vous connecter pour créer une Equipe', :strong => 'Accès Refusé :'}
      redirect_to new_club_team_player_path
    end
  end

错误出现在这一行:

@player.user_id = @user_ref.id

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

你在nil时分配一个值。我猜你应该把它放在像这样的else块中

def create
    if user_signed_in?
      @player = Player.new
      @user_ref = User.find_by_email(params[:new_player][:email])
      if @user_ref.blank?
        flash[:errors] = []
        flash[:errors] << {:message => "Adresse email introuvable", :strong => 'Erreur :'}

        redirect_to new_club_team_player_path
      else
      @player.user_id = @user_ref.id
      @player.position_id = params[:new_player][:position_id]
      end
      if @player.save
        redirect_to club_team_player_path(params[:club_id], params[:team_id], @player)
      else
        flash[:errors] = []
        flash[:errors] << {:message => "Une erreur est survenu lors de l'enregistrement de ce joueur", :strong => 'Erreur :'}

        redirect_to new_club_team_player_path
      end
    else
      flash[:errors] = []
      flash[:errors] << {:message => 'Vous devez vous connecter pour créer une Equipe', :strong => 'Accès Refusé :'}
      redirect_to new_club_team_player_path
    end
  end

答案 1 :(得分:0)

3件事。

首先,在某处记录params [:new_player] [:email],或使用pry-rails gem(我的选择)。您将看到您尝试用来查找用户的电子邮件。

其次,我相信新的语法是User.find_by(email:params [:new_player] [:email])

@ user_ref.blank?是不是该方法的适当实现.blank?。如果要检查用户对象,请使用

if @user_ref.present?

,甚至只是

if @user_ref,用于检查变量是否已分配给对象。

答案 2 :(得分:0)

好的问题是我必须将下一部分放在其他部分:

  def create
    if user_signed_in?
      @player = Player.new
      @user_ref = User.find_by_email(params[:new_player][:email])
      if @user_ref.blank?
        flash[:errors] = []
        flash[:errors] << {:message => "Adresse email introuvable", :strong => 'Erreur :'}

        redirect_to new_club_team_player_path
      else
        @player.user_id = @user_ref.id
        @player.position_id = params[:new_player][:position_id]

        if @player.save
          redirect_to club_team_player_path(params[:club_id], params[:team_id], @player)
        else
          flash[:errors] = []
          flash[:errors] << {:message => "Une erreur est survenu lors de l'enregistrement de ce joueur", :strong => 'Erreur :'}

          redirect_to new_club_team_player_path
        end
      end
    else
      flash[:errors] = []
      flash[:errors] << {:message => 'Vous devez vous connecter pour créer une Equipe', :strong => 'Accès Refusé :'}
      redirect_to new_club_team_player_path
    end
  end