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

时间:2015-02-03 11:05:06

标签: ruby-on-rails business-logic role-base-authorization

我有一个超级基本的电子商务应用,其中包含使用Omniauth进行身份验证的用户模型,带有名称和价格的产品型号,以及ShoppingCart和ShoppingCartItem模型(使用acts_as_shopping_cart宝石)。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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