2013-07-31 13 views
11

Istnieje strona kontaktowa, która oferuje wprowadzenie nazwy, telefonu, wiadomości e-mail i wiadomości, po czym wysyła wiadomość e-mail administratora. Nie ma powodu, aby przechowywać wiadomość w DB.Sprawdzanie poprawności tras z kontrolera

Pytanie. Jak:

  1. Stosować Szyny walidacji w kontrolerze, w ogóle nie używając modelu lub

  2. Stosować walidacji w modelu, ale bez żadnej relacji DB

UPD:

Model:

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 

kontrolera:

def sendmessage 
cpm = ContactPageMessage.new() 
if cpm.valid? 
    @settings = Setting.first 
    if [email protected] 
     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 
+0

Myślę, że masz już klasę o tej samej nazwie "ContactPageMessage". to jest problem. –

+0

Czy chcesz zapisać nazwę, telefon i adres e-mail w bazie danych, a tylko wiadomość musi zostać zatwierdzona i nie zapisana w bazie danych? – user2801

+0

@ Sumi, nie chcę być niczym zapisanym w DB. Właśnie zatwierdzono. – Roman

Odpowiedz

8

należy użyć modelu bez dziedziczenie z ActiveRecord::Base klasie.

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 

Dzięki temu można zainicjować nowy obiekt i wywołać sprawdzanie poprawności na tym obiekcie.

myślę, że mają inną nazwę klasy z tej samej nazwie, w kodzie kontrolera, widzę to:

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

jeśli jest to klasa Mailer zmienić jego nazwę na ContactPageMessageMailer. nie dostaniesz tego błędu od logera.

Mam nadzieję, że to pomoże. Dzięki

+0

Mam to: 'private method''new 'dla ContactPageMessage: Class' (przy użyciu Rails 4, może błąd w tym?) – Roman

+0

Wklej tutaj swój ślad aplikacji. –

+0

i jak wywołujesz nową metodę? napisz to tutaj. –

5

chciałbym jeszcze porad można użyć modelu szyny modele nie muszą dziedziczyć ActiveRecord::Base. Na przykład:

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 

i można go używać w kontroler z:

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

w modelu można dodać, poniżej którego będzie po prostu ustawić getter i metody setter dla wiadomości i można mieć walidacja na wiadomości bez konieczności kolumny w db

attr_accessor :message 
validates :message, presence: true 
+0

'klasa Contact ' ' validates: wiadomość,: obecność => true' 'end' ' # => NoMethodError: niezdefiniowana metoda 'sprawdza poprawność' dla kontaktu: Klasa' –

+0

Jeśli masz już model i tylko kilka z nich atrybuty nie trzeba przechowywać w db, a następnie można przejść z tej opcji. Powyższa opcja może zawierać tylko model, który dziedziczy po ActiveRecord :: Base.Jeśli chcesz niezależną klasę, która powinna działać jako model przy użyciu Rails4, bardzo łatwo musisz włączyć ActiveModel :: Model w twoją klasę i zrobić powyższe. Ref [link] (http://edgeapi.rubyonrails.org/classes/ActiveModel/Model.html) – user2801

Powiązane problemy