返回每个方法的字符串的Ruby对象数组。为什么?

时间:2011-08-08 21:57:33

标签: ruby arrays ruby-on-rails-3

有用的附加信息:我正在使用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,所以显然我做错了一些字符串而不是对象。我只是不知道是什么。有什么建议吗?

1 个答案:

答案 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。您可能希望这样做,或者您可能希望返回一个空集合以避免调用代码中出现异常。