我正在尝试在正确提交表单时呈现错误。所以我的表单从控制器点击索引,
def index
@player_types = squad.player_types
end
然后在索引视图中,
<%= form_tag({:action => :update}, :method => :put) do %>
<%= render 'shared/error_messages' %>
<table>
<% @player_types.order(:number).each do |p_type| %>
...do something...
<%end%>
<%end%>
在错误消息中,我有一个简单的错误检查(现在)失败
<% if @player_types.errors.any? %>
因为undefined method 'errors'
在大多数在线示例中,使用new
实例化对象时会给出错误方法。但是在我的情况下,对象最初具有要显示的内容。我在这里做错了,我是否应该使用@player_types
来捕获错误?
编辑:正如评论中所建议的那样,我已经在错误消息中循环了
<% @player_types.each do |p_type| %>
<% if @p_type.errors.any? %>
<%end%>
<%end%>
答案 0 :(得分:1)
这里有很多错误:
1)您需要ActiveRecord类的实例才能使用errors方法。
从上面的控制器代码中我假设你有一个带有实例数组的索引方法(has_many relation)squad.player_types
。 errors
方法只能在对象本身上调用(而不是在关系上),因为通常每个对象都有不同的数据可能有不同的错误。
2)如果不调用#save,#update或#valid,则error方法为空数组?在
之前的实例上对于实际包含任何错误的errors方法,您必须先调用一些运行验证的方法。当您使用'put'作为表单方法时,我假设您要更新某些内容,因此通常会通过RESTful approach中的更新方法来完成。如果你不关心你也可以在你的索引方法中做到这一点。我不清楚你想要做什么,所以我不能给你一个代码示例
3)您只能在实际发送javascript客户端验证之前验证您的数据。
正如我在2)中已经提到的那样,您需要在某些时候验证您的数据。这涉及从表单中获取一些数据到模型实例中,然后调用运行模型验证的方法。在发送表单之前验证表单的唯一选择是使用客户端HTML5或javascript验证。但要小心,客户端验证只是帮助用户的工具,并不足以强制您的数据正确。
Finnaly我想建议使用像simple_form或formtastic这样的表单库,它们已经能够很好地显示错误消息了,你可以在网上找到很多用法示例。它们。