【问题标题】:Rails 4 Business Logic, Authorization - Updating Prices based on AuthenticationRails 4 业务逻辑,授权 - 基于身份验证更新价格
【发布时间】:2015-02-03 11:05:05
【问题描述】:

我有一个超级基本的电子商务应用程序,其中包含通过 Omniauth 验证的 User 模型、带有名称和价格的 Product 模型以及 ShoppingCart 和 ShoppingCartItem 模型(使用 acts_as_shopping_cart gem)。

我的问题是,当我让用户通过 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 类来覆盖他们的价格方法,这一切都感觉不对,坦率地说我不知道​​它是否会起作用。

【问题讨论】:

    标签: ruby-on-rails business-logic role-base-authorization


    【解决方案1】:

    试试这个,如果有帮助的话

    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

    【讨论】:

    • 我会试一试。只是一个问题-attr_accessor 不是自具有强大参数的 Rails 4 以来已弃用的东西吗?还是你在这里耍什么花招?
    • @tony- 对不起,这是我的错。应该是cattr_accessor: current_user
    • 有趣 - 你能解释一下我以前从未见过的 cattr_accessor 吗?我实际上找到了自己的解决方案,我会继续发布它:)
    【解决方案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 提供程序被覆盖!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2019-01-18
      相关资源
      最近更新 更多