ruby-on-rails - 如何在线显示验证错误而不是在页面顶部

标签 ruby-on-rails validation devise inline omniauth

我试图让我的用户模型验证错误与其相应的表单字段内联显示。我正在使用 bootstrap 和设计。我有客户端验证,因此在大多数验证得到满足之前,它不会让您提交注册表单。问题是当用户通过 omniauth 注册 facebook 时。 Omniauth 将采用 facebook 给我的字段并为用户使用这些字段,但 facebook 不提供的字段会在页面顶部引发一个难看的错误。我一直在试图找到一种方法来让它们内联显示。

这是我的用户模型:

class User < ActiveRecord::Base

    has_many :bills, :dependent => :destroy

    validates :cell_phone, presence: true
    validates :cell_phone, length: { is: 10 }
    validates :cell_phone, :numericality => {:only_integer => true}
    validates :first_name, presence: true
    validates :last_name, presence: true
    validates :terms, presence: true

    geocoded_by :last_sign_in_ip
    after_validation :geocode


    # Include default devise modules. Others available are:
    # :confirmable, :lockable, :timeoutable and :omniauthable
    devise :database_authenticatable, :registerable, :omniauthable,
    :recoverable, :rememberable, :trackable, :validatable



    def ability
    @ability ||= Ability.new(self)
    end

    delegate :can?, :cannot?, :to => :ability



    def self.from_omniauth(auth)
        where(auth.slice(:sprovider, :uid)).first_or_create do |user|
            user.sprovider = auth.provider
            user.uid = auth.uid
            user.first_name = auth.info.first_name
            user.last_name = auth.info.last_name
            user.email = auth.info.email
            user.cell_phone = auth.info.cell_phone
            user.avatar = auth.info.image
        end
    end

这是我希望内联错误出现的设计注册表单:
<div class="row sign_in">
  <div class="col-md-6 col-md-offset-3 col-lg-4 col-lg-offset-4">


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


  <div class="row">
    <div class="form-group">
      <div class="col-md-6">  
        <%= f.text_field :first_name, autofocus: true , class:'form-control',placeholder:'First Name *' , :required => true %>
      </div>

      <div class="col-md-6">
        <%= f.text_field :last_name, class:'form-control',placeholder:'Last Name*' , :required => true %>
      </div>
    <div class="row">
    </div>
  </div>
</div>
  <div class="form-group">
      <%= f.phone_field :cell_phone, class:'form-control',placeholder:'Mobile Number*(Solely for notification purposes)', :required => true, :maximum => 10, :minimum => 10 %>
  </div>

   <div class="form-group">
      <%= f.email_field :email, class:'form-control',placeholder:'Email*', :required => true %>
  </div>

  <% if f.object.password_required? %>
    <div class="form-group">
      <% if @validatable %><i></i><% end %>
      <%= f.password_field :password, autocomplete: "off", class:'form-control',placeholder:'Password* (8 characters minimum)', id:"myPassword", :required => true %>
    </div>

    <div class="form-group">
      <%= f.password_field :password_confirmation, autocomplete: "off", class:'form-control',placeholder:'Password Confirmation*', :required => true %>
    </div>
  <% end %>
  <div class="form-group">
    <%= f.check_box :terms%>
    I have read and agreed the User

<a href="#" data-toggle="modal" data-target=".bs-example-modal-sm">Terms and Conditions</a>
         <div class="modal fade bs-example-modal-sm" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
          <div class="modal-dialog modal-md">
            <div class="modal-content">
              <p>
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec pretium libero eget posuere ornare. Donec rutrum augue eu erat fringilla posuere. Aenean tempus dui a erat facilisis posuere. Pellentesque eget nulla et turpis mollis egestas. Donec molestie consequat ultricies. Vivamus in feugiat risus. Ut a quam id sapien fringilla efficitur eget in justo. Suspendisse tincidunt libero metus. Sed ultrices auctor diam mattis pretium. Integer in aliquam dui. Praesent pulvinar ante non urna consectetur, eget porta lorem porta. Etiam ac orci pretium, faucibus neque vel, egestas velit. Nullam condimentum ultrices imperdiet. Maecenas vel nisi commodo, bibendum purus dapibus, porttitor felis.

Nullam nec porta lectus. Vivamus porta lobortis justo, sed cursus arcu tincidunt et. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque a rhoncus tellus. Ut mollis orci quis lacus consequat, quis varius nunc auctor. Ut elit ligula, bibendum quis mauris a, ornare elementum dui. Phasellus commodo ipsum eu augue consequat porta.</p>
            </div>
          </div>
        </div>
        </div>

  <div><i class="icon-heart"></i></div>
    <%= f.submit 'Sign up', class:'btn btn-primary btn-block' %> 

      <% end %>

  </div>
</div>
</body>
</html>

这是使用 facebook 按钮登录:
<div><i class="icon-heart"></i></div>
    <%= f.submit 'Sign in', class:'btn btn-primary btn-block' %> 
    <%= link_to "Sign in with facebook", user_omniauth_authorize_path(:facebook), class:'btn btn-primary btn-block' %>
    <br>
    <div align="center"> 
</div>

非常感谢有关如何显示这些验证错误的任何帮助。谢谢

最佳答案

您可以尝试向验证添加条件,即当存在 facebook id 时不验证某些属性(意味着用户正在从 facebook 注册)

validates :first_name, presence: true, if: Proc.new {|u| u.facebookid.nil? }

关于表单中的错误,您可以去掉显示所有错误的顶部部分,并使用
<%= user.errors[:first_name] %> 

靠近你的领域。您始终可以通过执行以下操作来访问属性(表单字段)错误
object.errors[:attributename]

关于ruby-on-rails - 如何在线显示验证错误而不是在页面顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25950008/

相关文章:

ruby-on-rails - 根据外键合并两个数组

java - Spring可以自动处理验证错误吗?

mysql - 用户记录保存到一个数据库但不在另一个数据库中

ruby-on-rails - 如何调试插件/gem? (附有设置和使用 ruby​​-debug gem 的有用说明)

ruby-on-rails - rails : How to validate format only if value is present?

没有注释的 spring 中的 Java 对象验证

validation - cakephp:删除单选按钮中所有选项中的星星

ruby-on-rails - 在不同版本的两个 Rails 应用程序之间共享设计 session cookie

ruby-on-rails - 如何访问服务对象中的设备登录

ruby-on-rails - HTTP Origin header (https ://example. com) 与 request.base_url (http ://example. com) 不匹配