actionview::template::error(nil:NilClass 的未定义方法 'html_safe')

actionview::template::error(undefined method 'html_safe' for nil:NilClass)

我是ruby的初学者,我想为redmine写一个插件。 我写了一个 运行 的插件,因为我在我的插件的控制器中使用了 'flash[:var]'。现在,当我想访问我的所有页面时,出现一条我不理解的错误消息。

Ruby 版本:ruby 1.9.3p484

Rails 版本:rails 3.2.19

this is the error message

感谢您的回答。

编辑:

this is the application_helper

您 运行 似乎遇到了在 flash 中具有 nil 值的情况。假设您有一个 flash,如 { error: nil },然后您将在 content_tag 中调用 v.html_safe - 这将导致错误。

您可能希望在调用 content_tag:

之前从 flash 中提取所有 present? 的值
def render_flash_messages
  flash.select { |k, v| v.present? }.map do |type, text|
    content_tag(:div, text.html_safe, class: "flash #{type}", id: "flash_#{typ}")
  end.join
end

您可以使用 .to_s 方法将 nil 转换为 string

问题

当您尝试在 nil 值上调用 .html_safe 时,它将抛出以下错误

NoMethodError: undefined method `html_safe' for nil:NilClass

例如

[8] project_rails »  html_content = nil
=> nil
[9] project_rails »  html_content.html_safe
NoMethodError: undefined method `html_safe' for nil:NilClass
from (pry):9:in `__pry__'

解决方案

您可以使用 .to_s

nil 转换为字符串

例如

[10] project_rails »  html_content = nil
=> nil
[11] project_rails »  html_content.to_s.html_safe
=> ""
[12] project_rails »  

所以你的代码应该是这样的

def render_flash_messages
    s = ''
    flash.each do |k,v|
        s << content_tag('div',v.to_s.html_safe, :class => "flash #{k}", :id => "flash_#{k}")
    end
    s.html_safe
end

问题是你将 nil 放入 flash 中,这是 Redmine 的 render_flash_messages 方法无法处理的。

改变处理 nil 值的方法是可行的,但不是你应该从 Redmine 插件做的事情。相反,请找出在您的插件中将 nil 放入闪存的位置和原因,而根本不这样做。