我有一个城市模型,其中一个属性是城市'名称'。
我已经做了一个辅助方法来返回'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">]
如何获取城市名称的文本并删除其余查询?
答案 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