2015-02-03 10 views
0

У меня есть супер базовое приложение для электронной торговли с моделью пользователя, аутентифицированной с помощью модели Omniauth, модели продукта с именем и ценой, а также моделей ShoppingCart и ShoppingCartItem (с использованием жемчужины acts_as_shopping_cart).Rails 4 Business Logic, авторизация - обновление цен на основе аутентификации

Моя проблема заключается в том, когда я аутентифицирую пользователя через поставщика Omniauth, я хочу предоставить скидки в зависимости от того, с кем они аутентифицируются.

Предположим, что они вступают в систему с facebook - тогда я хочу предоставить им скидку 20%. Я не уверен, как идти об этом на самом деле - я думаю, что я хочу написать эту бизнес-логику в моих продуктов и ShoppingCartItem моделей, устанавливая что-то вроде

def self.price 
    if current_user.provider == 'facebook' 
    super * 0.8 
    else 
    super 
end 

, но я не могу получить доступ к current_user в модели потому, что он устанавливается сеансом.

Должен ли я делать это в контроллере, где у меня есть доступ к current_user? Тогда мне придется открыть классы Product и ShoppingCartItem внутри контроллеров, чтобы переопределить их ценовые методы, которые все чувствуют не так, и, честно говоря, я не знаю, будет ли это работать.

ответ

0

я изменил мою стратегию немного. Я решил создать метод переопределения метода total на моем экземпляре shoppingcart. Я не хотел менять цены, я просто применил скидку к сумме, как вы бы видели на кассе.

Я создал метод экземпляра в модели 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 пользователя!

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

+0

Я сделаю снимок. Только один вопрос - это не 'attr_accessor' устаревшая вещь, поскольку Rails 4 с сильными параметрами? Или вы здесь что-то обманываете? – uechan

+0

@ tony- извините, это мой bad.it должен быть 'cattr_accessor: current_user' – Sontya

+0

Интересный - не могли бы вы объяснить, что такое' cattr_accessor', которого я никогда раньше не видел? Я на самом деле нашел свое собственное решение, я продолжу и опубликую его :) – uechan

 Смежные вопросы

  • Нет связанных вопросов^_^