Rails 4 Business Logic, Авторизация - Обновление цен на основе аутентификации
У меня есть супер базовое приложение для электронной коммерции с моделью User, аутентифицированной с помощью Omniauth, моделью Product с именем и ценой, а также моделями 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 ответа
Я немного изменил свою стратегию. Я решил создать метод, чтобы переопределить 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
где total
метод переопределяется на основе oauth-провайдера пользователя!
Попробуйте это, если это поможет
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