bourg-ismael
bourg-ismael

Reputation: 93

undefined method `id' for nil:NilClass on find_by

I have a problem with my controller.

When I try to add a Player I firstly find a user to link with player but when this email isn't registered I got this error :

undefined method `id' for nil:NilClass

I tried to use .nil?, .blank? but my if always fail to detect nil variable and I don't know why.

Here my controller:

  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

The error appear on this line :

@player.user_id = @user_ref.id

Any idea ?

Upvotes: 0

Views: 292

Answers (3)

bourg-ismael
bourg-ismael

Reputation: 93

Ok the problem was that I had to put the next part in a else part:

  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

Upvotes: 0

Sherwyn Goh
Sherwyn Goh

Reputation: 1352

3 things.

First, log that params[:new_player][:email] somewhere, or use pry-rails gem ( my pick ). You will get to see the email that you are trying to use to find the user.

Second, I believe the newer syntax for that is User.find_by(email: params[:new_player][:email])

@user_ref.blank? is not exactly the appropriate implementation of the method .blank?. If you are checking for a user object, use

if @user_ref.present?

, or even just

if @user_ref, which checks if the variable is assigned to an object.

Upvotes: 0

Pavan
Pavan

Reputation: 33542

You are assigning a value when it is nil.I guess you should be putting that in else block like this

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

Upvotes: 1

Related Questions