2013-07-31 18 views
11

Bir yöneticinin e-posta adresine gönderdikten sonra ad, telefon, e-posta ve mesaj girmeyi sağlayan bir iletişim sayfası vardır. DB'de mesaj saklamak için bir sebep yok.Denetleyiciden raylar geçerliliği

Soru. Nasıl yapılır: denetleyicisi

  1. Kullanım Raylar doğrulamaları, hiç modeli kullanılarak değil, OR modelde

  2. Kullanım doğrulamaları, ancak herhangi bir DB ilişkileri olmadan

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 

kontrolör: Hala modeli kullanmak için tavsiye ediyorum

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

Bence aynı adı 'ContactPageMessage' olan bir sınıfınız var. Sorun bu. –

+0

Veritabanına isim, telefon ve e-posta kaydetmek mi istiyorsunuz ve sadece mesajın doğrulanması ve veritabanına kaydedilmemesi gerekiyor mu? – user2801

+0

@sumi, DB'ye kaydedilmiş bir şey olmak istemiyorum. Sadece doğrulanmış. – Roman

cevap

8

modelini kullanması gereken bir sütun kalmadan iletide doğrulama.

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 

Bu sayede yeni nesneyi başlatabilir ve bu nesnedeki doğrulamaları çağırabilirsiniz.

senin de aynı isimle farklı sınıf adı var, Denetleyiciniz kodunda, bu görebilirsiniz:

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

Bu mailler sınıf ContactPageMessageMailer adını değiştirmek ise. hiçbir hata bu hataya sahip olmayacak.

Yardım edin. Teşekkürler

+0

Bu şeye sahibim: 'private method' 'yeni' ContactPageMessage: Class' için çağrıldı (Rails 4 kullanma, belki hata Bu?) – Roman

+0

Başvuru izninizi buraya yapıştırın. –

+0

ve yeni yöntemi nasıl arıyorsunuz? Bunu buraya yaz. –

5

, raylar modelleri ActiveRecord::Base devralmak zorunda değildir. Örneğin :

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 

ve controller ile de kullanabilirsiniz: İleti için aşağıda sadece belirleyecektir alıcı ve ayarlayıcı yöntemi ekleyebilir modelinde

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

ve sahip olabilir ActiveRecord::Base sınıftan miras olmadan db

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

'sınıf Contact' ' doğrular: mesajı: varlığı => TRUE 'Sonu ' ' # => NoMethodError: tanımsız yöntem 'Contact için doğrular: Class' –

+0

Zaten bir model ve sadece birkaç varsa öznitelikleri db'de saklamanıza gerek yoktur, bu seçenekle devam edebilirsiniz. Yukarıdaki seçenekte yalnızca ActiveRecord :: Base'den devralınan Modele yer verebilirsiniz.Eğer Rails4 kullanarak Model olarak davranması gereken bağımsız bir Sınıf istiyorsanız, çok kolay bir şekilde sınıfınızda ActiveModel :: Model'i dahil etmeniz ve yukarıdakileri yapmanız gerekir. Ref [link] (http://edgeapi.rubyonrails.org/classes/ActiveModel/Model.html) – user2801