31 votes

Contactez-nous fonctionnalité dans Rails 3

Je souhaite faire un formulaire de contact dans Rails 3 avec les champs suivants:

  • Nom
  • Email
  • Titre du message
  • Corps du message

Les messages postés sont destinés à aller à mon adresse e-mail, donc je ne dois pas nécessairement stocker les messages dans la base de données. Dois-je utiliser ActionMailer , une gemme ou un plugin pour cela?

66voto

marflar Points 13293

Ce tutoriel est un excellent exemple - et c'est de Rails 3

Mise à jour:

Cet article est un meilleur exemple que celui que j'ai posté plus tôt, fonctionne parfaitement

Deuxième Mise À Jour:

Je vous recommande aussi la fusion-dans certaines des techniques décrites dans ce railscast sur le active_attr gem, où Ryan Bates vous guide à travers le processus de configuration d'un tabless modèle pour une page de contact.

9voto

JJD Points 7539

J'ai mis à jour la mise en œuvre doit être aussi proche que possible du RESTE de la spécification.

La configuration de base

Vous pouvez utiliser le mail_form gem. Après l'installation il suffit de créer un modèle nommé Message similaires, comme il est décrit dans la documentation.

# app/models/message.rb
class Message < MailForm::Base
  attribute :name,          :validate => true
  attribute :email,         :validate => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
  attribute :message_title, :validate => true
  attribute :message_body,  :validate => true

  def headers
    {
      :subject => "A message",
      :to => "contact@domain.com",
      :from => %("#{name}" <#{email}>)
    }
  end
end

Cela va déjà vous permettre de tester l'envoi d'e-mails via la console.

Page de Contact

Afin de créer une page de contact, procédez comme suit.

# app/controllers/messages_controller.rb
class MessagesController < ApplicationController
  respond_to :html

  def index
  end

  def create
    message = Message.new(params[:contact_form])
    if message.deliver
      redirect_to root_path, :notice => 'Email has been sent.'
    else
      redirect_to root_path, :notice => 'Email could not be sent.'
    end
  end

end

Configuration du routage ..

# config/routes.rb
MyApp::Application.routes.draw do
  # Other resources
  resources :messages, only: [:index, :create]
  match "contact" => "messages#index"
end

Préparer une forme partielle ..

// app/views/pages/_form.html.haml
= simple_form_for :contact_form, url: messages_path, method: :post do |f|
  = f.error_notification

  .form-inputs
    = f.input :name
    = f.input :email, label: 'Email address'
    = f.input :message_title, label: 'Title'
    = f.input :message_body, label: 'Your message', as: :text

  .form-actions
    = f.submit 'Submit'

Et de rendre le formulaire dans la vue ..

// app/views/messages/index.html.haml
#contactform.row
  = render 'form'

1voto

rodrigoalves Points 1168

Je n'ai pas pu faire fonctionner le code de cet exemple et je pense que cela rend les choses un peu complexes depuis la création d'un modèle.

Anywat, j'ai fait un formulaire de contact et j'ai blogué à ce sujet .. le texte est en portugais mais le code lui-même est (principalement) en anglais http://www.rodrigoalvesvieira.com/formulario-contato-rails/

Remarque: j'ai utilisé sendmail, pas SMTP.

Merci!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X