我的模型中有许多标准的rails验证:
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。
任何帮助都会很棒!
由于
答案 0 :(得分:6)
如果您有Validation failed (ActiveRecord::RecordInvalid)
声明且其中任何一个声明返回{{},那么您将收到before_validation
错误并显示空错误消息(如果没有其他错误) 1}}。
请注意,false
回调不得返回before_validation
(false
可以),这可能会偶然发生,例如,如果您要将nil
分配给布尔属性在该回调方法内的最后一行。在你的回调方法中明确地写回return以使其工作(或者如果你的回调是一个块(如上所述here),则在结尾处为真。)
UPDATE :这将不再是启动Rails 5.0的问题,因为false
将不再停止回调链(return false
现在将暂停回调链)。
更新:如果回调返回throw :abort
,您可能还会收到ActiveRecord::RecordNotSaved: Failed to save the record
。
答案 1 :(得分:5)
我设法解决了问题的根源。在我使用的控制器中:
redirect_to :action => :edit
我应该一直在使用:
render :action => :edit
通过使用redirect_to,我在控制器中执行编辑操作,然后从数据库获取新的摄像机对象,而不是从更新操作中保留当前的摄像机对象。
答案 2 :(得分:2)
除非您致电@camera.save
或@camera.valid?
,否则错误哈希将不会填充验证错误。请检查您的控制器代码。
答案 3 :(得分:2)
您可以在控制器代码中使用flash [:message]或flash [:notice]来存储错误消息,可以在视图中显示错误消息。Link查看链接,它是清楚地解释了如何附加错误消息并使用它们来显示。实例变量doestnot包含任何错误,因为更新中没有验证运行。
您可以使用@camera_errors = @ camera.save收集错误,然后
<% @camera_errors.errors.full_messages.each do |error| %>
<p><%= error %></p>
<% end %>
答案 4 :(得分:1)
我不确定这是否是您可能感兴趣的内容,但您可以使用此官方Rails gem:dynamic_form
这个gem为您提供了两种辅助方法:error_messages
和error_messages_for
有关详细信息,请参阅以下Rails指南:http://guides.rubyonrails.org/active_record_validations_callbacks.html#displaying-validation-errors-in-the-view