2016-07-10 9 views
0

私は単純な1ページの連絡フォームに取り組んでいます。連絡先モデルには、電話と電子メールという2つの属性があります。電子メールはバックエンドで検証する必要があります(私は自分のモデルでそれを行いました)。しかし、ユーザーは連絡フォームに電子メールまたは電話のいずれかを記入して送信することができます。必要な電子メールフィールドがなく、私はそれをオプションにする方法を知らない。バックエンド(Rails)で電子メールを検証し、このフィールドをフォームに入力しないようにするにはどうすればよいですか?

contact.rb

class Contact < MailForm::Base 
attribute :phone 
attribute :email,  :validate => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i, 
         presence: false 

def headers 
    { 
    :subject => "My Contact Form", 
    :to => "[email protected]", 
    :from => %("#{phone}" <#{email}>) 
    } 
end 

contacts_controller.rb

class ContactsController < ApplicationController 

    def new 
    @contact = Contact.new 
    end 

    def create 
    @contact = Contact.new(contact_params) 
    @contact.request = request 
    if @contact.deliver 
     flash.now[:notice] = 'Ваша заявка принята!' 
     render :new 
    else 
     flash.now[:notice] = 'Введите корректный email.' 
     render :new 
    end 
    end 

    private 

    def contact_params 
    params.require(:contact).permit(:phone, :email) 
    end 
end 

new.html.erb

<%= simple_form_for @contact, html: {class: 'form-inline'} do |f| %> 
     <div class="form-group"> 
      <div class="col-sm-6"> 
       <%= f.input_field :email, class: "form-control", placeholder: "email", required: false %> 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-sm-6"> 
       <%= f.input_field :phone, class: "form-control", placeholder: "+7 (095) 123-45-67" %> 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-sm-6"> 
       <%= f.button :submit, 'Submit', :class=> "btn btn-success" %> 
      </div> 
     </div> 
     <div class="form-group"> 
     <div class="col-sm-12"> 
      <% flash.each do |key, value| %> 
       <div class="alert alert-info" role="alert"> 
       <div class="alert alert-<%= key %>"><%= value %></div> 
       </div> 
      <% end %> 
     </div> 
     </div> 
<% end %> 
+0

これは1が合格するために必要されている間、ユーザは、電話または電子メールを入力することができますいずれかを意味していますか?または、電子メールが存在する場合はその電子メールを検証したいだけですか? – oreoluwa

答えて

0

私はおそらくそれについてこの道を行くだろう:

class Contact < MailForm::Base 
    attribute :phone 
    attribute :email,  :validate => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i, 
         presence: false, allow_blank: true 
    validate :at_least_a_contact 

    def headers 
    { 
     :subject => "My Contact Form", 
     :to => "[email protected]", 
     :from => %("#{phone}" <#{email}>) 
    } 
    end 
    private 
    def at_least_a_contact 
     unless phone.present? || email.present? 
     errors.add(:contact, "You need at least a contact method") 
     end 
    end 
end 
+0

ありがとう、それは動作します! – ermolushka

関連する問題