Bonjour à tous et à toutes,

je m’entraîne à utiliser rails. J'ai créé un système authentification pour l'utilisateur, évidemment il peut accéder à ces informations. Mais s'il est connecté, il peut aussi les modifier. Et c'est à partir de ce moment que je connais un problème, la redirection avec le patch fonctionne bien mais il n' y a aucune modification de son pseudo. L'utilisateur a beau rentrer son nouveau pseudo, il ne se modifie pas.

Voici mon code dans le controller sessions :

class SessionsController < ApplicationController
  def new
  end

def show
    @page = User.find(params[:id])

end

def update
    User.find(params[:id]).update name: params[:name]
    redirect_to "/profil/#{current_user.id}"
end

  def create
    user = User.find_by_email(params[:email])
    # If the user exists AND the password entered is correct.
    if user && user.authenticate(params[:password])
      # Save the user id inside the browser cookie. This is how we keep the user
      # logged in when they navigate around our website.
      session[:user_id] = user.id
      redirect_to '/'
    else
    # If user's login doesn't work, send them back to the login form.
      redirect_to '/login'
    end
  end

  def destroy
    session[:user_id] = nil
    redirect_to '/login'
  end
end

Voici mon code dans le show:

<h1>Profil</h1>
 
<% if current_user && @page.id == current_user.id %>
<%= form_tag "/profil/#{@page.id}", method: "patch" do %>
<ul>
    <li><input type="text" name="name" value="<%= current_user.name %>" /></li>
    <li><%= image_tag current_user.avatar.url(:thumb) %></li>
  <input type="submit" value="Enregistrer mon profil" />
</ul>
<% end
else
 %>
<%= @page.name %>
<br>
<%= image_tag @page.avatar.url(:thumb) %>
 
<% end %>

Voici ma routes :

Rails.application.routes.draw do
  get 'sessions/new'

  get 'users/new'

  # For details on the DSL available within this file, see <a href="http://guides.rubyonrails.org/routing.html" rel="nofollow">http://guides.rubyonrails.org/routing.html</a>

    get '/signup' => 'users#new'
    post '/users' => 'users#create'

      get '/login' => 'sessions#new'
  post '/login' => 'sessions#create'
  get '/logout' => 'sessions#destroy'

  get '/profil/:id' => 'sessions#show'
  patch '/profil/:id' => 'sessions#update'
end

Après plein d'essais, je n'arrive toujours pas à trouver mon erreur.

Merci de m'éclairer ^^

3 réponses


Fatavis
Auteur

Merci Advancid, à priori cela fonctionne cependant je ne mets pas encore en résolu car il me reste deux trois trucs à régler pour finir le système d'authentification, et encore merci !

Fatavis
Auteur

Bonjour,
je rencontre un nouveau problème et cela fait bien quatres heures que je regarde mon code et que je ne sais pas comment le régler.
Je suis donc toujours dans mon système d'authentification mais lorsqu'un utilisateur s'inscrit, je souhaite controler les informations qu'il envoie. Par exemple, il n'a pas droit de mettre un pseudo qui existe déjà en base de donnée. Mais je n'y arrive tout simplement pas.

Voici mon new


<h1>Signup!</h1>

<%= form_for :user, url: '/users' do |f| %>

  Name: <%= f.text_field :name %>
  Email: <%= f.text_field :email %>
  Password: <%= f.password_field :password %>
  Password Confirmation: <%= f.password_field :password_confirmation %>
  <%= f.file_field :avatar %>
  <%= f.submit "Submit" %>

<% end %>

et mon controller

class UsersController < ApplicationController

  def new
  end

  def create
     @users = User.all
    @cunter_name = 0
 @users.each do |user| 
      if user.name == params[:name] 
         @cunter_name = 1 
     end
end 

        if @cunter_name == 0
            user = User.new(user_params) 
            if user.save
              session[:user_id] = user.id
              flash[:success] = "Inscription réalisé avec succès" 
              redirect_to '/login'
            else
              redirect_to '/signup'
            end
        else
          redirect_to '/signup'
        end
  end

private

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

Quand je rentre un pseudo déjà en base de donnée, il réalise quand même l'inscription. j'en déduis donc params[:name] ne vaut rien que dois-je mettre à la place ?
Ou si ma déduction est fausse comment dois-je faire ?

Merci d'avance pour vos réponses

Fatavis
Auteur

Merci et je pense que ça sera me dernère question comment puis-je afficher l'erreur à l'utilisateur ?

J'ai vu que l'on pouvait faire cela :

  validates :name, presence: { message: "Vous avez oubliez d'entrer votre mot de passe ^^" }

Mais je ne sais pas comment l'exploiter dans ma page d'inscription.
Merci d'avance