Reputation: 93
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
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
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
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