如何在rails应用程序中实现相同联系表单的简短版本?

时间:2016-04-26 14:01:15

标签: ruby-on-rails simple-form mail-form

我不确定我是否正确表达了这个标题,但我希望在我的索引页面上有一个简短版本的联系表格。问题是较短的版本仍然期望与长版本相同的验证,并且当出现错误时它会重定向到contacts / new路径。我该怎样处理这样的情况;因为这个简短的联系表格需要与长版本不同的行为,我是否必须以某种方式将不同的联系表格组合在一起?任何有关如何做到这一点的帮助或建议将不胜感激。


这是在根页面

    <%= simple_form_for @contact, :html => {:class => 'form-horizontal' } do |f| %>
      <div class="form-group">
        <div class="control-label col-sm-3">
          <%= f.label :firstName, 'Name' %>
        </div>
        <div class="col-sm-6">
          <%= f.input_field :firstName, class: "form-control", placeholder: "Name" %><br/>
        </div>
      </div>

      <div class="form-group">
        <div class="control-label col-sm-3">
          <%= f.label :email, 'Email' %><br/>
        </div>
        <div class="col-sm-6">
          <%= f.email_field :email, class: "form-control", placeholder: "Email" %><br/>
        </div>
      </div>

      <div class="form-group">
        <div class="control-label col-sm-3">
          <%= f.label :phoneNumber, 'Phone' %>
        </div>
        <div class="col-sm-6">
          <%= f.input_field :phoneNumber, class: "form-control", placeholder: "Phone" %><br/>
        </div>
      </div>

      <div class="form-group">
        <div class="col-sm-6 col-sm-offset-3">
          <%= f.button :submit, 'Submit Request', :class=> "btn btn-primary" %>
        </div>
      </div>
    <% end %>

模型

    class Contact < MailForm::Base
  validates_presence_of :firstName, :lastName, :email, :budget, :message => "Can't Be Blank"

  attribute :firstName
  validates_format_of :firstName, :with => /\A([a-z]|[A-Z])/i

  attribute :lastName
  validates_format_of :lastName, :with => /\A([a-z]|[A-Z])/i

  attribute :company
  validates_format_of :company, :with => /\A([a-z]|[A-Z])/i,
                                :allow_blank => true

  attribute :email
  validates_format_of :email, :with => /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i,
                              :message => "Invalid Format"

  attribute :phoneNumber
  validates_format_of :phoneNumber, :with => /\(?([0-9]{3})\)?([ .-]?)([0-9]{3})\2([0-9]{4})/i,
                                    :allow_blank => true,
                                    :length => { :minimum => 10, :maximum => 31 },
                                    :message => "Invalid Format"

  attribute :requestedArea, :validate => true
  validates_format_of :requestedArea, :with => /\A([a-z]|[A-Z])/i

  attribute :requestedState
  validates_format_of :requestedState, :with => /\A([a-z]|[A-Z])/i,
                                       :allow_blank => true
  attribute :requestedCity
  validates_format_of :requestedCity, :with => /\A([a-z]|[A-Z])/i,
                                      :allow_blank => true
  attribute :contactMethod
  attribute :budget, :validate => true
  attribute :numberOfRooms

  attribute :numberOfOccupants
  attribute :purpose
  attribute :pets
  attribute :petType
  attribute :numberOfPets
  attribute :arrivalDate

  attribute :departureDate
  validates_format_of :departureDate, :with => /\d{2}\/\d{2}\/\d{4}/i,
                                      :allow_blank => true
  def headers
    {
      :subject => "Quote Requested!",
      :to => "anthonydevenuto@gmail.com",
      :from => %(#{email})
    }
  end
end

控制器

class ContactsController < ApplicationController
  def new
    @contact = Contact.new
  end
  def create
    @contact = Contact.new(params[:contact])
    # @contact.request = request
    if @contact.deliver
      flash[:notice] = 'Thank you for your request. We will contact you soon!'
      redirect_to root_path
    else
      flash.now[:error] = 'Cannot send message.'
      render :new
    end
  end
end

1 个答案:

答案 0 :(得分:0)

例如,在模型中声明accessor属性,并在需要跳过某些验证时使用它。

class Contact < MailForm::Base
   attr_accessor :short_form

   validates_presence_of :firstName, :lastName, :email, :budget, :message => "Can't Be Blank", unless: -> { short_form }

   # etc
end

在控制器中使用它:

def action
   contact = Contact.find_by_id(params[:id])

   # ... do with contact
   if params[:short_form]
       contact.short_form = true
   end

   contact.save!
end