有用的附加信息:我正在使用decent_exposure gem,所以这可能是问题 - 纠正下面的代码:
expose(:get_filter_tags) do
if params[:filter_tag_names]
filter_tag_names = Array(params[:filter_tag_names].split(" "))
filter_tags = Array.new
filter_tag_names.each do |f|
t = Tag.find_by_name(f)
filter_tags << t
end
end
end
所以,当我在视图中调用它时会发生一些有趣的事情:
query string ?utf8=✓&filter_tag_names=test
<% get_filter_tags.each do |ft| %>
<%= ft.name %>
<% end %>
错误消息:“test”的未定义方法`name':String
为什么这会尝试在字符串上调用name而不是Tag对象?如果我在视图中放入以下内容,并且有一个filter_tag_names项目
def getfiltertag
Tag.find_by_name(params[:filter_tag_names])
end
#view
<%= getfiltertag.name %>
query string: ?utf8=✓&filter=test
就像上面那样,我可以很好地调用name,所以显然我做错了一些字符串而不是对象。我只是不知道是什么。有什么建议吗?
答案 0 :(得分:4)
您的问题是each
返回self
- 所以如果您写filter_tag_names.each
,它会返回filter_tag_names
。您可以通过显式返回filter_tags
来解决此问题,但更具惯用性,您可以将其重写为:
expose(:get_filter_tags) do
if params[:filter_tag_names]
filter_tag_names = Array(params[:filter_tag_names].split(" "))
filter_tag_names.map {|f| Tag.find_by_name(f) }
end
end
除此之外,如果没有任何过滤器标签名称,此方法将返回nil
。您可能希望这样做,或者您可能希望返回一个空集合以避免调用代码中出现异常。