使用before_filter根据位置筛选产品列表



我有一个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.rb

def 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)

相关内容

  • 没有找到相关文章

最新更新