1

RubyGeocoder メソッドを使用するスコープがあり、 を使用nearして場所でイベントをフィルタリングしますparam[:searchCity]。パラメータはユーザーの地理位置情報を取得するため、ユーザーの近くでのみイベントが表示されます。現在、events_controllerインデックス アクションで動作していますが、ホームページでも呼び出す必要があります。

データベースからデータを取得するフィルターであることを考えると、モデルに入れるのが最善だと思いましたが、モデルにパラメーターを使用することが適切か悪いかについて矛盾する情報を見つけています。また、パラメータが存在するモデルでは動作しません。

このようなもののベストプラクティスは何ですか? スコープ、モデル、コントローラー、ヘルパー、またはその他の場所はどこに配置すればよいですか?

これが私のコードです:

Model:
class Event < ActiveRecord::Base
  # attr, validates, belongs_to etc here.
  scope :is_near, self.near(params[:searchCity], 20, :units => :km, :order => :distance) #doesn't work with the param, works with a "string"
end

Controller:
def index
  unless params[:searchCity].present?
    params[:searchCity] = request.location.city
  end

  @events = Event.is_near

  # below works in the controller, but I don't know how to call it on the home page
  # @events = Event.near(params[:searchCity], 20, :units => :km, :order => :distance)

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @events }
  end
end

The line I'm calling in my home page that gets how many events are in the area
<%= events.is_near.size %>

編集:ラムダの使用は機能しているようです。このようにしてはいけない理由はありますか?

Model:
class Event < ActiveRecord::Base
  scope :is_near, lambda {|city| self.near(city, 20, :units => :km, :order => :distance)}
end

Controller:
def index
  @events = Event.is_near(params[:searchCity])
...

home.html.erb
<%= events.is_near(params[:searchCity]).size %>
4

1 に答える 1