Helper String concatenation / Find current Controller

时间:2014-04-29 20:54:32

标签: ruby-on-rails ruby ruby-on-rails-4 helper string-concatenation

我正在尝试获取错误通知的当前控制器。

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`

我缺少什么?

2 个答案:

答案 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)本身,这使得使用嵌套表单更容易使用此代码。