Rails - 如何只返回ActiveRecord记录的文本

时间:2013-04-29 04:58:50

标签: ruby-on-rails

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

我已经做了一个辅助方法来返回'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">]

如何获取城市名称的文本并删除其余查询?

3 个答案:

答案 0 :(得分: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 %>

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

答案 1 :(得分:1)

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

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对象,因此速度更快。

答案 2 :(得分: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