Rails 4 业务逻辑,授权 - 基于身份验证更新价格

Rails 4 Business Logic, Authorization - Updating Prices based on Authentication

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

我的问题是,当我让用户通过 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 类 来覆盖它们的价格方法,这一切都感觉不对,坦率地说,我不知道它是否会起作用。

尝试一下,如果有帮助的话

class 应用程序控制器 < ActionController::Base before_filter 做 |obj| User.current_user = User.find(obj.session[:user]) 除非 obj.session[:user].nil?<br> 结尾 结束

class User < ActiveRecord::Base attr_accessor :current_user end

我稍微改变了策略。我决定创建一个方法来覆盖我的购物车实例上的 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

然后我就可以在controller中调用这个方法然后传入current_user

shopping_carts_controller.rb

def show
  @shopping_cart.discount(current_user)
end

在视图中,我只有 @shopping_cart.total,其中 total 方法根据用户的 oauth 提供商被覆盖!