我有一个局部视图,用于显示特定模型的flash消息。该局部视图如下:
app/views/mymodel/_flashpartial.erb
<% flash.each do |key, value| %>
<% if model_key = myModelFlash(key) then %>
<%= content_tag(:div, value, :class => "flash #{model_key}") %>
<% end %>
<% end %>
myModelFlash
方法只是简单地使用一个简单的正则表达式来获取键并检查特定前缀。它位于app/helpers/mymodelhelper.rb文件中。
module MyModelHelper
def myModelFlash( key )
m = /^_mymodel_(.*)/.match(key)
m[1] unless m.nil?
end
end
在我的开发和测试环境中,这个功能完美地运行。但是一旦部署到Heroku上,就会出现一个错误(ActionView::Template::Error),指向对
match
的调用,错误信息为"无法将符号转换为字符串"。如果我从视图中删除对
myModelFlash
的调用,并仅显示键和值,那么它在不出错的情况下可以正常工作,因此至少键和值已经成功地传递到了部分视图中。由于某种原因,辅助方法认为传递给它的键是一个符号而不是字符串。有任何想法可能是发生了什么?
model_key = myModelFlash(key.to_s)
可行,不过正如提到的那样,这是一个折中方案。稍后我会检查一下 Ruby/Gem 的版本,看能找到什么解决方法。 - Bryan Marble.match(key.to_s)
中使用.to_s
会更好。被调用的函数应该“修整”属性,而不是调用者。为了调试问题...好的,这可能会很长,所以我会更新答案,当我们有更多的空间时。 - Arsen7