【问题标题】:Rails not generating validation fail messagesRails 不生成验证失败消息
【发布时间】:2011-09-06 16:14:49
【问题描述】:

我的模型中有许多标准导轨验证:

validates_presence_of :url_string
validates_uniqueness_of :url_string
validates_presence_of :stream_source
validates_presence_of :width
validates_presence_of :height
validates_presence_of :name
validates_uniqueness_of :name
validates_presence_of :customer_name
validates_presence_of :iframe_background_color

如果我没有填写表单中的这些字段之一,那么我会按预期返回表单,但奇怪的是没有显示错误消息。我正在使用下面的代码来显示错误消息:

<% @camera.errors.full_messages.each do |error| %>
  <p><%= error %></p>
<% end %

我还尝试打印出@camera.errors 对象,如下所示:

#<ActiveModel::Errors:0x12db19bc @base=#<Camera id: 1, stream_source: "test", width: 640, height: 360, active: true, name: "test", url_string: "CAYD19Vp", customer_name: "test", iframe_background_color: "#FFFFFF", online: true, created_at: "2011-08-30 15:54:16", updated_at: "2011-09-06 15:52:48", audio: true, iframe_text_color: "#FF00FF", iframe_link_color: "#FF0000", notes: "Some notes!", offline_image_file_name: "Cake.jpg", offline_image_content_type: "image/jpeg", offline_image_file_size: 196591, offline_image_updated_at: "2011-09-06 12:12:38", pull_stream_url: "test", bitrate: "300-500", show_branding: false>, @messages={}>
#

如您所见,消息哈希为空。我尝试通过执行以下操作手动设置验证错误消息:

validates_presence_of :name, :message => "No name present" 

但它也没有填充消息哈希。

控制器更新动作如下图:

def update
  @camera = Camera.find(params[:id])
  if @camera.update_attributes(params[:camera])
    flash[:notice] = "Camera updated"
    redirect_to nwcadmin_camera_path
  else
    redirect_to :action => :edit
  end 
end 

我正在使用 Ruby 版本 ruby​​ 1.9.2p290 和 Rails 版本 3.1.0。

任何帮助都会很棒!

谢谢

【问题讨论】:

  • 控制器代码在这里可能会有所帮助。
  • 谢谢,我已经添加了控制器更新操作。
  • 我设法找到了问题的根源,但由于我在另外 7 个小时内无法回答自己的问题,所以我暂时将解决方案放在这里。在我使用的控制器中:redirect_to :action => :edit 我应该一直在使用:render :action => :edit 通过使用 redirect_to 我在控制器中点击编辑操作,然后从数据库中获取一个新的相机对象而不是从更新操作中保留相机对象。

标签: ruby-on-rails ruby-on-rails-3.1


【解决方案1】:

请注意,当您有 before_validation 声明并且其中任何一个返回 false 时,您将收到带有空错误消息(如果没有其他错误)的 Validation failed (ActiveRecord::RecordInvalid) 错误。

请注意,before_validation 回调不能返回 falsenil 可以),这可能是偶然发生的,例如,如果您将 false 分配给该回调方法内最后一行的布尔属性.在你的回调方法中显式写 return true 以使其工作(或者如果你的回调是一个块(如 here 所述),则在最后只写 true)。

更新:从 Rails 5.0 开始,这将不再是问题,因为 return false 将不再停止回调链(throw :abort 现在将停止回调链)。

更新:如果回调返回false,您可能还会收到ActiveRecord::RecordNotSaved: Failed to save the record

【讨论】:

  • 哇。我永远不会猜到这一点。感谢您为我节省了数小时的检查时间!
  • @LawrenceWu,是的,我自己花了几个小时才找到问题。 :-)
【解决方案2】:

我设法找到了问题的根源。在我使用的控制器中:

redirect_to :action => :edit

我应该一直在使用:

render :action => :edit

通过使用redirect_to,我在控制器中点击了编辑操作,然后从数据库中获取了一个新的相机对象,而不是从更新操作中保留当前的相机对象。

【讨论】:

    【解决方案3】:

    除非您调用 @camera.save@camera.valid?,否则错误哈希不会填充验证错误。请检查您的控制器代码。

    【讨论】:

    【解决方案4】:

    可以在控制器代码中使用flash[:message]或者flash[:notice]来存储错误信息,可以在view中使用来显示错误。Link看链接,解释的很清楚,如何附加错误消息并使用它们来显示。实例变量不包含任何错误,因为更新中没有运行验证。

    您可以使用@camera_errors = @camera.save 收集错误然后

      <% @camera_errors.errors.full_messages.each do |error| %>
       <p><%= error %></p>
      <% end %>
    

    【讨论】:

      【解决方案5】:

      我不确定您是否对此感兴趣,但您可以使用这个官方 Rails gem:dynamic_form

      这个 gem 提供了两个辅助方法:error_messageserror_messages_for

      有关更多信息,请参阅以下 Rails 指南:http://guides.rubyonrails.org/active_record_validations_callbacks.html#displaying-validation-errors-in-the-view

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-05
        相关资源
        最近更新 更多