使用before_filter根据位置过滤产品列表

时间:2014-06-14 05:44:44

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 rails-geocoder

我有一个Deals Rails应用程序,显示主页上的产品列表。

交易具有deal_country属性。

我的目标:我想应用一个过滤器来过滤显示给那些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

我没有收到任何错误,但它不是“过滤”/显示基于用户所在国家/地区的交易。它没有什么不同,好像我没有放置任何超过前过滤器。方法

我该怎么做?

修改

为了确保它不起作用,我已经在美国创建了与deal.deal_country = US的交易。但在本地,我被视为处于FRance状态,我仍然可以看到它。 注意:通过这样做,我已经在本地/开发模式下使用我的法语IP(我确信它不会因为我放入主页视图:&lt;%= Geocoder.search(request.remote_ip).first。 country%&gt;它显示法国)

在application_controller.rb

def lookup_ip_location
    if Rails.env.development?
      Geocoder.search(request.remote_ip).first
    else
      request.location
    end
  end

在config / envrionment / 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) }

1 个答案:

答案 0 :(得分:0)

你在!忘了def filter_deals_based_on_visitor_country,所以不会被调用。

即使你纠正了这个错误,你也会在这一行中出现错误

@deal = Deal(:deal_country => visitor_country)

正确的语法是

@deal = Deal.find_by(:deal_country => visitor_country)