2016-04-28 8 views
0

ユーザーモデルの検証エラーを、対応するフォームフィールド(ブートストラップとデバイス)と共にインラインで表示する方法を教えてください。ページ上部にエラーが表示されるため、このユーザーは保存できません: フルネームは空白にできません 電話番号は空白にできません 生年月日は少なくとも18歳以上である必要があります 対応する行の横にそれを取得しますか?対応するフォームフィールドとインラインで表示するユーザーモデルの検証エラーを取得する方法

私のユーザモデル

class User < ActiveRecord::Base 

    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable,:confirmable 

    validates :fullname, presence: true, length: {maximum: 40} 
    validates :phone_number, presence: true, length: {maximum: 12} 
    validates :password, :format => { :with => /(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/, 
    :message => "Password should contain at least 6 characters, one upper case, one lower case and one numeric." }, on: :create 
    validates :password, :format => { :with => /(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/, 
    :message => "Password should contain at least 6 characters, one upper case, one lower case and one numeric." }, on: :update, allow_blank: true 

    validates_date :date_of_birth, :before => lambda { 18.years.ago }, 
           :before_message => "must be at least 18 years old" 

    has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100#" }, :default_url => "/images/missing.png" 
    validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/ 


end 

あなただけのこれを行い、ブートストラップのための準備ができてラッパーを持ってsimple_form宝石を見てとることで起動する場合があります私のHTMLビューファイル

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> 
     <%= devise_error_messages! %> 

     </br> 
     <div class="col-md-6 col-md-offset-3 text-left"> 
    <div class="row"> 
      <label class="col-xs-4" for="fullname">Fullname</label> 
       <div class="col-xs-8">  
        <%= f.text_field :fullname, :class => 'form-control', :placeholder => 'Full Name', autofocus: true %> 
       </div></br></br></br> 
    </div> 
    <div class="row"> 
     <label class="col-xs-4" for="Email1">Email</label> 
      <div class="col-xs-8"> 
       <%= f.email_field :email, :class => 'form-control', :placeholder => 'Email' %> 
      </div> 
    </div></br> 
    <div class="row"> 
       <label class="col-xs-4" for="phone_number">Phone Number</label> 
        <div class="col-xs-8"> 
        <%= f.text_field :phone_number, :class => 'form-control', :placeholder => 'Phone Number', autofocus: true %> 
        </div> 
      </div></br> 
     <div class="row"> 
       <label class="col-xs-4" for="date_of_birth">Date of Birth</label> 
        <div class="col-xs-8"> 
        <%= f.date_select :date_of_birth, order: [:day, :month, :year], :start_year=>1910 %> 
        </div> 
       </div></br> 


     <div class="row"> 
      <% if @validatable %> 
         <em>(<%= @minimum_password_length %> characters minimum)</em> 
        <% end %> 
       <label class="col-xs-4" for="password">Password</label> 
       <div class="col-xs-8">     
        <%= f.password_field :password, :class => 'form-control', :placeholder => 'Password', autocomplete: "off" %> 
       </div> 
     </div> 

     <div class="actions"> 
     <%= f.submit "Sign up", :class => "btn btn-primary" %> 
     </div> 
    <% end %> 
+0

シンプルフォームのような宝石を使うことをお勧めします。 – coderhs

+0

この行をどのように置き換えることができるのかをdeviseでサポートできますか?<%= form_for(resource、as:resource_name、url:registration_path(resource_name))do | f | %> <%= devise_error_messages! %> – MSK

+0

https://github.com/plataformatec/simple_form/wiki/Simple-Form-with-Devise – coderhs

答えて

1

あなたには、いくつかの理由で、まだ自分自身をロールバックする場合は、フォームビルダは、そのフィールドに対応してエラーがあることにより、ラップされたオブジェクトかどうかを確認する必要があります。すべての行のためにこれをやっもちろん

<div class="row"> 
    <% if f.object.errors[:full_name] %> 
    <ul> 
     <% f.object.errors[:full_name].each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
    </ul> 
    <% end %> 
</div> 

があります本当に退屈なので、ヘルパーメソッドを宣言したり、独自のフォームビルダークラスを作成することができます。

class MyFormBuilder < ActionView::Helpers::FormBuilder 
    def row_for_field(field, options = {}) 
    errors = @object.errors[field] 
    row_classes = ['row'] 
    row_classes << 'invalid' if errors.any? 
    @tempate.content_tag(:div, class: row_classes) do 
     if errors.any? 
     @tempate.content_tag(:ul, class: 'errors') do 
      errors.each do |msg| 
      @tempate.content_tag(:li, msg) 
      end 
     end 
     end 
     yield 
    end 
    end 
end 

あなたはその後、どうなる:

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)), form_builder: MyFormBuilder do |f| %> 
    <%= f.row_for_field :fullname do %> 
    <%= f.text_field :fullname %> 
    <% end %> 
<% end %> 

しかし、その後、再び - simple_formを使用しています。ブートストラップを使用する全理由は、フロントエンド以外のものにあなたの時間を費やしています。

+0

PS。ラベルの代わりに 'placeholder'属性を使用しないでください!それは深刻なアクセシビリティの問題です。 https://www.w3.org/WAI/tutorials/forms/labels/ – max

関連する問題