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

Другие вопросы по тегам