actionview :: template :: error (método no definido ‘html_safe’ para nil: NilClass)

Soy un principiante en ruby ​​y quiero escribir un plugin para redmine. He escrito un complemento que se estaba ejecutando desde que uso ‘flash [: var]’ en un controlador de mi complemento. Ahora, cuando quiero acceder a todas mis páginas, aparece un mensaje de error que no entiendo.

Versión Ruby: Ruby 1.9.3p484

Versión de Rails: Rails 3.2.19

este es el mensaje de error El mensaje de error

Gracias por sus respuestas.

EDITAR:

este es el application_helper

the application_helper

Parece que te encuentras con situaciones en las que no tienes nil valor en tu flash . Imagina que tienes un flash como { error: nil } , entonces llamarías v.html_safe en content_tag , lo que causará el error.

¿Es posible que desee extraer todos los valores del flash que están present? , antes de llamar a content_tag :

 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 

Puedes convertir el nil en una string usando el método .to_s

Problema

Cuando intenta llamar a .html_safe en un valor nil , producirá el siguiente error

 NoMethodError: undefined method `html_safe' for nil:NilClass 

Por ejemplo

 [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__' 

Solución

Puedes convertir el nil en una cadena usando .to_s

Por ejemplo

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

Entonces tu código debería ser así

 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 

El problema es que no pones nil en el flash, lo cual es algo que el método render_flash_messages de Redmine no está diseñado para manejar.

Cambiar ese método para tratar con valores nulos funcionará, pero no es algo que deba hacer desde un complemento de Redmine. En su lugar, descubra dónde y por qué en su complemento no pone nil en el flash y simplemente no lo hace.