我有一个超级基本的电子商务应用程序,其中包含通过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
方法的位置!