嵌套属性形成错误消息自定义

时间:2014-07-27 07:16:05

标签: ruby-on-rails hash nested-forms

我有以下型号

class OrgPerson < ActiveRecord::Base
    has_and_belongs_to_many :TypRole
    has_and_belongs_to_many :OrgContact
    has_one :OrgCredential, dependent: :destroy
    belongs_to :OrgCompany, foreign_key:"org_company_id"
    belongs_to :TypPosition, foreign_key:"typ_position_id"
    validates :first_name, presence: true
    validates :last_name, presence: true
    accepts_nested_attributes_for :OrgCredential
end

class OrgCredential < ActiveRecord::Base
    belongs_to :OrgPerson, foreign_key:"org_person_id"
    validates :user_name, presence: true
    validates :password, length: { minimum: 6 }
    before_create :create_remember_token
    has_secure_password
end

以及以下强参数:

def person_params
  params.require(:org_person).permit(:first_name, :last_name, 
    org_credential_attributes: [:password, :password_confirmation])

end

以及以下new.html.erb

    <%= form_for(@person) do |f| %>
    <%= render 'shared/error_messages' %>
    <div class="col-md-12 ">
      <%= f.text_field :first_name, placeholder: "First Name", :class => "form-control" %>
      <%= f.text_field :last_name, placeholder: "Last Name", :class => "form-control" %>
      <%= f.fields_for :org_credentials do |oc|%>
            <%= oc.password_field :password, placeholder: "Password", :class => "form-control" %>
            <%= oc.password_field :password_confirmation, placeholder: "Password Confirmation", :class => "form-control" %>
      <% end %>
    <%= f.submit "Create my account", class: "btn btn-large btn-primary" %>
    </div>
   

在shared / error_messages

 <% if @person.errors.any? %>
     <div id="error_explanation" class="col-md-12">
       <div class="alert alert-danger" role="alert">
         The form contains <%= pluralize(@person.errors.count, "error") %>.
       </div>
       <ul>
       <% @person.errors.full_messages.each do |msg| %>
         <li>* <%= msg %></li>
       <% end %>
       </ul>
     </div>
 <% end %>

enter image description here

图中显示的问题是,当我只想说“密码太短”时,它会说“组织凭证密码太短”。我对rails非常陌生,我觉得我必须遍历错误哈希以吐出“密码太短”,但我不确定这是否是唯一的方法,或者是否有更方便。我希望有可能遇到同样问题的人可以告诉我他们是如何解决的。

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以在模型中添加自定义验证错误消息。

class OrgCredential < ActiveRecord::Base
    belongs_to :OrgPerson, foreign_key:"org_person_id"
    validates :user_name, presence: true
    validates :password, length: { minimum: 6 }, message: "Password is too short"
    before_create :create_remember_token
    has_secure_password
end

请仔细阅读Active Record Validations了解更多详情。

答案 1 :(得分:1)

<强>协会

首先,您需要知道Rails对于关联名称定义需要snake_case - 对于类名称需要CamelCase

#app/models/org_person.rb
Class OrgPerson < ActiveRecord::Base
   has_and_belongs_to_many :typ_roles
   has_and_belongs_to_many :org_contacts

   has_one :org_credential, dependent: :destroy
   belongs_to :org_company
   belongs_to :typ_position

   validates :first_name, presence: true
   validates :last_name, presence: true
   accepts_nested_attributes_for :org_credential
end

-

讯息

关于您的错误消息,以及推荐的Rahul Singh,您需要考虑定义custom error messages for your validations

您可以使用以下内容执行此操作:

   validates :first_name, :last_name,
       presence: { message: "You Need To Enter A Name!" }

这将为您提供自定义消息,但 是Rails的一个难点,因为很难获得要定制的属性名称。

如果您只想显示消息,最好使用此类内容(实时代码):

<% @person.errors.each do |attr,msg| %>
    <li><%= msg %></li>
<% end %>

答案 2 :(得分:0)

谢谢大家的回答。

我不知道Rails有点坚持,感谢Rich。

我实际上用Michal的回答指出了正确的方向。 似乎真正摆脱属性名称的唯一方法是 实际上,在configs / locales中的en.yml文件中自定义每个错误消息。

以下指南是帮助我解决此问题的非常有用的链接:

http://adamhooper.com/eng/articles/5

如果有人遇到同样的问题,请参阅adam hopper的文章。

导轨指南:http://guides.rubyonrails.org/i18n.html#pluralization有一些帮助,但没有第一个资源那么多。

干杯!