我有一个使用RubyGeocoder方法near
的范围,使用param[:searchCity]
按位置过滤事件。 param获取用户的地理位置,因此它只显示靠近它们的事件。我目前在events_controller
索引操作中使用它,但我还需要在我的主页上调用它。
考虑到它是一个从数据库中获取数据的过滤器,我认为最好进入模型,但我发现有关模型中的参数是否正确或不良实践的相互矛盾的信息。此外,我无法让它在模型中使用param存在。
这样的事情的最佳做法是什么?我应该在哪里放置范围,模型,控制器,帮助器或其他地方?
这是我的代码:
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 %>
编辑:使用lambda似乎正在运行。我有什么理由不这样做吗?
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 %>
答案 0 :(得分:0)
无法访问模型中的参数。 Params是仅存在于控制器和视图级别的东西。
所以最好的方法是在控制器中编写一些辅助方法来执行此操作。
Class Mycontroller < ApplicationController
before_action fetch_data, :only => [:index]
def fetch_data
@data = Model.find(params[:id])#use params to use fetch data from db
end
def index
end