0

我有一个城市模型,其中一个属性是城市“名称”。

我已经完成了一个帮助方法来返回“n”个城市,实现如下:

辅助方法:

def list_cities(start, stop)
    cities = City.find(:all, order: "name asc", limit: stop-start, select: "name")
    cities.each do |city|
        "<li> #{city.name} </li>"
    end
end

查看代码:

   <%= list_cities(1,22) %>

但是,它会在视图中返回以下内容:

 [#<City name: "Abilene">]

如何仅获取城市名称的文本并摆脱查询的其余部分?

4

3 回答 3

2

问题是您的方法 list_cities 没有返回您认为的字符串。它只返回一个城市对象数组,因为每个方法都是这样做的。看起来您正在将控制器和视图逻辑混合到帮助程序中。我要做的是:

在控制器中设置 @cities 实例变量:

@cities = City.find(:all, order: "name asc", limit: stop-start, select: "name")

在视图中:

<% @cities.each do |city| %>
  <li><%= city.name %></li>
<% end %>

这样,您就可以将控制器和视图逻辑分开。

于 2013-04-29T05:17:34.917 回答
1

Erez 的回答是解决这个问题的最佳方式。但我想分享你可以对你的方法做些什么来以最小的改变实现你想要的。您需要将您的助手更改为以下内容

def list_cities(start, stop)
  cities = City.all(order: 'name ASC', limit: stop - start, select: 'name')
  cities.map { |city| "<li> #{city.name} </li>" }.join.html_safe
end

其他更改只是减少代码的小重构。在不知道您使用的 rails 版本的情况下,我没有更改查询,但如果您使用的是 3.2,您应该可以访问pluck哪个更快,因为它不会创建 ActiveRecord 对象。

于 2013-04-29T06:15:54.173 回答
0

尝试:

def list_cities(start, stop)
  content = ''
  cities = City.find(:all, order: "name asc", limit: stop-start, select: "name")
  cities.each do |city|
    content << "<li> #{city.name} </li>\n"
  end
  content
end
于 2013-04-29T06:48:56.580 回答