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



我有一个超级基本的电子商务应用程序,其中包含通过Omniauth身份验证的用户模型,具有名称和价格的产品模型以及购物车和购物车模型(使用acts_as_shopping_cart宝石)。

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

假设他们使用Facebook登录 - 那么我想为他们提供20%的折扣。我不确定实际上该怎么做 - 我想我想在我的产品和购物车项目中编写这个业务逻辑,设置类似的东西

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

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

我应该在我有权访问current_user的控制器中执行此操作吗?然后,我必须在控制器中打开产品和购物车项类以覆盖其价格方法,这感觉都是错误的,坦率地说,我不知道它是否有效。

试试这个,如果有帮助的话

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

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

在视图中,我只有@shopping_cart.total根据用户的 oauth 提供程序覆盖total方法的位置!

最新更新