使用Rails我试图得到一个错误消息,如“歌曲字段不能为空”保存。做以下事情:

validates_presence_of :song_rep_xyz, :message => "can't be empty"

... 只显示“Song Rep XYW不能为空”,这是不好的,因为字段的标题不是用户友好的。如何更改字段本身的标题?我可以更改数据库中字段的实际名称,但我有多个“song”字段,我确实需要特定的字段名称。

我不想破坏rails的验证过程,我觉得应该有办法解决这个问题。


当前回答

是的,有一种方法可以在没有插件的情况下做到这一点! 但是它不像使用上面提到的插件那样干净和优雅。在这儿。

假设它是Rails 3(我不知道它在以前的版本中是否不同),

在你的模型中保持这个:

validates_presence_of :song_rep_xyz, :message => "can't be empty"

而在观,而不是离开

@instance.errors.full_messages

当我们使用脚手架生成器时,输入:

@instance.errors.first[1]

您将只得到您在模型中指定的消息,而没有属性名。

解释:

#returns an hash of messages, one element foreach field error, in this particular case would be just one element in the hash:
@instance.errors  # => {:song_rep_xyz=>"can't be empty"}

#this returns the first element of the hash as an array like [:key,"value"]
@instance.errors.first # => [:song_rep_xyz, "can't be empty"]

#by doing the following, you are telling ruby to take just the second element of that array, which is the message.
@instance.errors.first[1]

到目前为止,我们只显示了一条消息,总是针对第一个错误。如果你想显示所有错误,你可以在哈希中循环并显示值。

希望这有帮助。

其他回答

我试着跟随,为我工作:)

1 job.rb

class Job < ApplicationRecord
    validates :description, presence: true
    validates :title, 
              :presence => true, 
              :length => { :minimum => 5, :message => "Must be at least 5 characters"}
end

2 jobs_controller.rb

def create
      @job = Job.create(job_params)
      if @job.valid?
        redirect_to jobs_path
      else
        render new_job_path
      end     
    end

3 _form.html.erb

<%= form_for @job do |f| %>
  <% if @job.errors.any? %>
    <h2>Errors</h2>
    <ul>
      <% @job.errors.full_messages.each do |message|%>
        <li><%= message %></li>
      <% end %>  
    </ul>
  <% end %>
  <div>
    <%= f.label :title %>
    <%= f.text_field :title %>
  </div>
  <div>
    <%= f.label :description %>
    <%= f.text_area :description, size: '60x6' %>

  </div>
  <div>
    <%= f.submit %>
  </div>
<% end %> 

升级了@Federico回答为所有字段错误的通用答案。

在你的控制器中。

flash[:alert] = @model.errors.messages.values 
# [["field1_err1", "field1_err2"], ["field2_err1"], ["field3_err1"]]

与rails docs中一样,messages方法“返回属性的散列及其错误消息数组”。

然后,在表单中显示这些错误:

<% flash.each do |type, type_arr| %>
  <% type_arr.each do |msg| %>
    <ul>
      <li>
        <%= msg.to_sentence %>
      </li>
    </ul>
  <% end %>
<% end %>

如果你想把它们都列在一个漂亮的列表中,但又不想使用不友好的名字,你可以这样做……

object.errors.each do |attr,message|
  puts "<li>"+message+"</li>"
end

是的,有一种方法可以在没有插件的情况下做到这一点! 但是它不像使用上面提到的插件那样干净和优雅。在这儿。

假设它是Rails 3(我不知道它在以前的版本中是否不同),

在你的模型中保持这个:

validates_presence_of :song_rep_xyz, :message => "can't be empty"

而在观,而不是离开

@instance.errors.full_messages

当我们使用脚手架生成器时,输入:

@instance.errors.first[1]

您将只得到您在模型中指定的消息,而没有属性名。

解释:

#returns an hash of messages, one element foreach field error, in this particular case would be just one element in the hash:
@instance.errors  # => {:song_rep_xyz=>"can't be empty"}

#this returns the first element of the hash as an array like [:key,"value"]
@instance.errors.first # => [:song_rep_xyz, "can't be empty"]

#by doing the following, you are telling ruby to take just the second element of that array, which is the message.
@instance.errors.first[1]

到目前为止,我们只显示了一条消息,总是针对第一个错误。如果你想显示所有错误,你可以在哈希中循环并显示值。

希望这有帮助。

一个解决方案可能是改变i18n的默认错误格式:

en:
  errors:
    format: "%{message}"

默认格式:%{attribute} %{message}