我有一个Deals Rails应用程序在主页上显示产品列表。
交易有一个deal_country属性。
我的目标:我想应用一个before过滤器来过滤那些deal.deal_country与用户国家相同的交易列表(通过ip检测获得)
我尝试了以下操作,但它不起作用:
class StaticPagesController < ApplicationController
before_filter :filter_deals_based_on_visitor_country,
:only => [ :home]
def filter_deals_based_on_visitor_country
visitor_country = request.location.country
@deal = Deal.find_by(:deal_country => visitor_country)
end
def home
@deals = Deal.featured_on_homepage.to_a # deals that are now active given their start date
respond_to do |format|
format.html # home.html.erb
format.json { render json: @deals }
format.xml { render :xml => @deals }
# format.atom
end
end
end
我没有得到任何错误,但它不是"过滤"/显示交易基于用户的国家。它没有什么不同,就好像我没有添加任何东西,除了before过滤器。方法。
我该怎么做?
编辑为了确保它不起作用,我用deal.deal_country= US"创建了正在美国发生的交易。但在当地,我被认为是在法国,我仍然可以看到。注意:我已经通过这样做在本地/开发模式下放置了我的法语ip(我确信它正在工作,因为当我放入主页视图:<%= Geocoder.search(request.remote_ip).first。country %>显示法国)
在application_controller.rbdef lookup_ip_location
if Rails.env.development?
Geocoder.search(request.remote_ip).first
else
request.location
end
end
在config/环境/development.rb class ActionDispatch::Request
def remote_ip
"84.34.156.155" # fake ip for example
end
end
模型/deal.rb
scope :featured_on_hp, lambda { default.where('date_launch_date <= ? AND date_end_date >= ?', Time.zone.now, Time.zone.now).where(featured: true) }
你在def filter_deals_based_on_visitor_country
中忘记了!
,所以它没有被调用。
即使你改正了这个错误,你也会在这一行得到一个错误
@deal = Deal(:deal_country => visitor_country)
正确的语法是
@deal = Deal.find_by(:deal_country => visitor_country)