2013-04-29 48 views
0

我有一个城市模型,其中一个属性是城市“名称”。Rails - 如何返回ActiveRecord记录的文本

我做了一个辅助方法返回 'N' 城市数量和实现的过程如下:

helper方法:

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

这听起来像你正在寻找勇气:http://apidock.com/rails/ActiveRecord/Calculations/pluck – John 2013-04-29 05:07:19

回答

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 %> 

这样,你的控制器和视图逻辑分离。

+0

好吧,这为我工作。但我想后续的问题是,如果这种类型的逻辑不应该放在助手中,辅助方法的理想用法是什么? – Zephyr4434 2013-04-29 14:31:28

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

+0

我确实可以进行采摘。那么查询是:City.all(order:'name ASC',limit:stop-start).pluck(:name)? – Zephyr4434 2013-04-29 14:32:56

+0

nope。它应该像'City.order('name ASC')一样链接。limit(stop - start).pluck(:name)' – jvnill 2013-04-30 00:12:24

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 
相关问题