0

都市のモデルがあり、属性の 1 つは都市の「名前」です。

「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

その他の変更は、コードを削減するための小さなリファクタリングです。使用しているレールのバージョンがわからないので、クエリを変更しませんでしたが、3.2 を使用している場合は、pluckActiveRecord オブジェクトが作成されないため、どちらの方が高速にアクセスできるはずです。

于 2013-04-29T06:15:54.173 に答える