0

我有一个超级基本的电子商务应用程序,其中包含通过 Omniauth 验证的用户模型、带有名称和价格的产品模型以及 ShoppingCart 和 ShoppingCartItem 模型(使用acts_as_shopping_cartgem)。

我的问题是,当我让用户通过 Omniauth 提供商进行身份验证时,我想根据他们的身份验证对象提供折扣。

假设他们使用 facebook 登录 - 那么我想为他们提供 20% 的折扣。我不知道实际上该怎么做 - 我想我想在我的 Product 和 ShoppingCartItem 模型中编写这个业务逻辑,设置类似

def self.price 
  if current_user.provider == 'facebook'
    super * 0.8 
  else
    super
end

但我无法current_user在模型中访问,因为它是由会话设置的。

我应该在可以访问 current_user 的控制器中执行此操作吗?然后我必须在控制器中打开 Product 和 ShoppingCartItem 类来覆盖他们的价格方法,这一切都感觉不对,坦率地说我不知道​​它是否会起作用。

4

2 回答 2

0

试试这个,如果有帮助

class ApplicationController < ActionController::Base before_filter do |obj| User.current_user = User.find(obj.session[:user]) unless obj.session[:user].nil?
end end

class User < ActiveRecord::Base attr_accessor :current_user end

于 2015-02-03T11:15:06.747 回答
0

我稍微改变了策略。我决定创建一个方法来覆盖total我的购物车实例上的方法。我不想更改价格,我只是将折扣应用于总价,就像您在结帐视图中看到的那样。

我在模型中创建了一个实例方法,shopping_cart.rb如下所示:

def discount(user)
  if user && user.provider == 'facebook'
    def total
      super * 0.8
    end
  else
    def total
      super
    end
  end
end

然后我可以在控制器中调用这个方法并传入current_user那里。

shopping_carts_controller.rb

def show
  @shopping_cart.discount(current_user)
end

在视图中,我只是根据用户的 oauth 提供者来覆盖@shopping_cart.total该方法!total

于 2015-02-05T03:27:42.680 回答