我正在尝试获取错误通知的当前控制器。
helper.rb
def error_message_for(field, options = {:prepend_text => "#{'<i class="fa fa-bullhorn"></i> '}"}, controller = {:current => "@" + params[:controller] })
error_message = controller[:current].errors[field][0]
if error_message
raw "#{options[:prepend_text]} #{error_message}"
end
end
但我为“@screens”收到了NoMethodError
undefined method
错误:String`
我缺少什么?
答案 0 :(得分:1)
errors
个对象上访问 ActiveRecord::Base
方法,例如,在您的情况下,您的模型实例(屏幕)可以扩展ActiveRecord::Base
。
目前您收到的错误为NoMethodError undefined method errors for "@screens":String
因为您没有在errors
(&#34; @ screens&#34;)而不是模型实例上调用String
方法。 "@screens"
是通过连接"@" + params[:controller]
形成的字符串,它不是实例变量@screens
。
因此,您需要将模型类的实例传递给error_message_for
方法,然后在其上调用errors
。
例如:
def error_message_for(object, field, options = {:prepend_text => "#{'<i class="fa fa-bullhorn"></i> '}"}})
error_message = object.errors[field][0]
if error_message
raw "#{options[:prepend_text]} #{error_message}"
end
end
请按以下方式调用:
<%= form_for(@screen) do |f| %>
<%= error_message_for(@screen,:field_name) %>
<% end %>
答案 1 :(得分:1)
如果您希望获得表单中字段的错误消息,可以通过执行以下操作来获取该字段:
<%= form_for(@screen) do |f| %>
<%= f.object.errors.get(:field_name) %>
<% end %>
或帮助
# in view
<%= error_message_for(f, :field_name) %>
# in helper
def error_message_for(form_object, field_name, ...)
error_messages = form_object.object.errors.get(field_name)
if error_messages.present?
raw "#{...} #{error_messages.first}"
end
end
此解决方案的好处是您不需要传递对象(@screen
)本身,这使得使用嵌套表单更容易使用此代码。