我有一个超级基本的电子商务应用,其中包含使用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类来覆盖他们的价格方法,这些方法都感觉不对,坦率地说我不知道它是否会起作用。
答案 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
方法!