17 votes

Validation Rails à partir du contrôleur

Il existe une page de contact, qui permet de saisir le nom, le téléphone, l'adresse électronique et le message, après quoi le message est envoyé à l'adresse électronique d'un administrateur. Il n'y a aucune raison de stocker le message dans la base de données.

Question. Comment faire ?

  1. Utiliser les validations Rails dans le contrôleur, sans utiliser le modèle, OU

  2. Utiliser les validations dans le modèle, mais sans relations avec la base de données

UPD :

Modèle :

class ContactPageMessage
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming

attr_accessor :name, :telephone, :email, :message
validates :name, :telephone, :email, :message, presence: true
validates :email, email_format: { :message => "  E-mail "}

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

def persisted?
  false
end
end

contrôleur :

def sendmessage
cpm = ContactPageMessage.new()
if cpm.valid?
    @settings = Setting.first
    if !@settings
        redirect_to contacts_path, :alert => "Fail"
    end
    if ContactPageMessage.received(params).deliver
        redirect_to contacts_path, :notice => "Success"
    else
        redirect_to contacts_path, :alert => "Fail"
    end
else
    redirect_to contacts_path, :alert => "Fail"
end
end
end

12voto

Rails Guy Points 2447

Vous devez utiliser le modèle sans hériter de ActiveRecord::Base classe.

class ContactPageMessage

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

  attr_accessor :whatever

  validates :whatever, :presence => true

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

  def persisted?
    false
  end

end

Cela vous permettra d'initialiser un nouvel objet et d'appeler des validations sur cet objet.

Je pense que vous avez un nom de classe différent avec le même nom, dans le code de votre contrôleur, je peux voir ceci :

if ContactPageMessage.received(params).deliver
    redirect_to contacts_path, :notice => "Success"
else

s'il s'agit de votre classe d'envoi, changez son nom en ContactPageMessageMailer . vous n'obtiendrez plus cette erreur.

J'espère que cela vous aidera. Merci de votre compréhension.

6voto

Marek Lipka Points 42344

Je vous conseille toujours d'utiliser le modèle, les modèles de rails n'ont pas besoin d'hériter de ActiveRecord::Base . Par exemple :

class Contact
  include ActiveModel::Validations
  attr_accessor :name, :telephone, :email, :message
  validates_presence_of :name, :telephone, :email, :message
  validates_format_of :email, with: EMAIL_REGEXP
end

et vous pouvez l'utiliser dans votre contrôleur avec :

contact = Contact.new
# ...
if contact.valid?
  # do something
else
  # do something else
end

-4voto

user2801 Points 316

Dans votre modèle, vous pouvez ajouter la méthode suivante qui définira les méthodes getter et setter pour le message et vous pourrez valider le message sans avoir de colonne dans la base de données.

attr_accessor :message
validates :message, presence: true

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