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