Skip to content

Ruby On Rails : Créer un formulaire de contact

Soyez sociable ! Partagez :
  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Beaucoup (voir tous) des sites web que je développe demande un formulaire de contact. Cette page contenant des informations précieuses à propos de la société, où parfois un petit formulaire nous permettant de contacter l’entreprise. Bref, une page plus que présente sur le web.

Aujourd’hui, j’aimerai vous présenter comment créer un formulaire de contact avec Ruby On Rails.

phone_telephone_266159_l

 

Créer un formulaire de contact avec Ruby On Rails

Le model

Vous serez probablement d’accord avec moi, il est très rare de vouloir sauvegarder en base de données les mails que vous envoient les utilisateurs (a moins d’avoir une très grosse entreprise… genre… Facebook, ou Google).

Il faut donc créer un model qui ne soit pas relié à la base de données :

class Contact

  attr_accessor :firstname, :lastname, :email, :message

  validates :lastname, :firstname, :email, :message, presence: true
  validates :email, :format => { :with => %r{.+@.+\..+} }, allow_blank: true

end

Si vous utilisez ce model, vous aurez quelques problèmes, notamment,  parce que la validation des données n’est pas incluse dans votre “class” et oui, “ActiveRecord::Base” inclut aussi la validation des données. Il faut donc l’inclure :

include ActiveModel::Validations
include ActiveModel::Conversion
extend  ActiveModel::Naming

Ensuite, il vous faut également créer deux méthodes :

def persisted?
  false
end

def initialize(attributes = {})
  attributes.each do |name, value|
    send("#{name}=", value)
  end
end

“persisted?” est une fonction créée juste pour que ça ne bug pas !

“initialize” permet tout simplement d’utiliser le

Contact.new params[:contact]

Car cette fonction est incluse également dans le “ActiveRecord::Base” .

On a fait le tour du model, jetons un oeil maintenant au controller

Le controller

Le controller est très simple (comme devrait l’être tous controllers…).
Pour l’envoie d’un nouveau message, on va utiliser l’opération….
*roulement de tambour*
NEW

 

Ensuite pour, la création et l’envoie, je vous le donne en mille, on utilise l’opération CREATE :

class ContactsController < ApplicationController

  def new
    @contact = Contact.new
  end

  def create
    @contact = Contact.new params[:contact]

    if @contact.valid?
      Mailer.contact_form(@contact).deliver # Je vais expliquer cette ligne juste après...
      redirect_to new_contact_path, flash: {success: t(:"create.message_has_been_sent")}
    else
      render :new
    end
  end

end

Le Mailer

“Mailer.contact_form(@contact).deliver”

En fait Mailer est une class proposée par Rails permettant la gestion d’envoie de mail. Elle est gérée de la même manière qu’un controller. C’est à dire que Mailer possède un ensemble de procédure liée à une vue pouvant être imbriquée dans un layout.

Dans le dossier app/mailers, on créé un fichier mailer.rb dont voici le contenu :

class Mailer < ActionMailer::Base

  layout 'mailer'

  def contact_form(contact)
    @contact = contact
    @to = "<un email>"

    mail(to: @to, subject: "Nouveau contact depuis le site") do |format|
      format.html
    end
  end

end

Donc, nous avons une class Mailer héritant de “ActionMailer” ayant pour layout “mailer“.

Cette classe possède une procédure “contact_form” prenant en charge l’envoie d’un email au format HTML.

@to prend l’email de la personne à qui doit être envoyé l’email.

La vue

La vue est la façon dont sera envoyée le mail :

%p
  Un nouveau message a été envoyé depuis le site :
%p
  %strong= "Nom : "
  = @contact.lastname
  %br
  %strong= "Prénom : "
  = @contact.firstname
  %br
  %strong= "Adresse email : "
  = @contact.email
  %br
  %strong= "Message : "
  %br
  = simple_format @contact.message

J’utilise du HAML à vous de le transformer si vous utilisez du erb.

Il ne vous reste plus qu’à paramétrer votre serveur d’envoie de mail (j’utilise mailjet), et le tour est joué !

Qu’avez-vous pensé de ce tutoriel ? Avez-vous aimé ? Faites-vous autrement ? Dites m’en plus !

Enjoy it !

Soyez Sociable ! Partagez !
Published inRubyOnRailsTutoriel
  • Raphaël FOSSE

    Bonsoir, merci pour ce tuto qui à l’air très soigné !
    J’ai une petite question, je n’ai pas compris le passage sur la validation de données sur ActiveRecord. Ou-est ce que tu mets :
    include ActiveModel::Validations
    include ActiveModel::Conversion
    extend ActiveModel::Naming

    Merci ! Et bonne soirée.

    • p0k3

      Juste après l’ouverture de la classe :

      “class Contact
      include ActiveModel::Validations
      ….

      Bonne journée 🙂

  • Archipo

    Bonjour,

    J’ai tenté de reproduire ce que vous avez fait, malheureusement j’ai une erreur :
    “NameError – uninitialized constant ContactController:”

    J’ai tenté de trouver une réponse sur Google/StackOverflow sans succès …

    • p0k3

      Je pense que vous avez oublié un “s” à Contact dans ContactController

banner