【问题标题】:Add customer_id to order when placed, retrieve it in customer index下订单时添加customer_id,在客户索引中检索
【发布时间】:2023-03-19 13:19:02
【问题描述】:

我正在尝试创建一个订购系统,以便在下订单时,客户登录/注册并将订单添加到他们的索引中。我有两个控制器和它们各自的模型/视图等 - 称为订单和客户。我假设我需要添加一个方法,以便在下订单时将 customer_id 添加到订单中,然后我可以在该特定客户的索引中显示具有该 ID 的所有订单 - 即他们只能看到自己的订单.

这可能是一个很简单的问题,抱歉!但我是 Rails 的新手,不知道如何开始使用这个。请问有人可以建议我如何去做吗?

编辑:

感谢大家的帮助!如何让客户索引仅显示该客户的订单?我会在他们登录时将 customer_id 存储在会话中,然后将其放入订单中,然后在索引页面中找到具有该 ID 的所有订单吗?我想我知道如何在登录时将他们的 id 放入会话中,但不确定如何将其提取到客户索引视图中。任何帮助将不胜感激!

【问题讨论】:

    标签: ruby-on-rails ruby database controller


    【解决方案1】:

    如果您创建的订单表有一个 customer_id,并在客户下订单时填写该 ID,那么订单的客户视图应始终以他们的订单为范围。您需要区分客户用户和管理员用户(也许是您?),例如(类似):

    class customer
      has_many :orders
    end
    
    class order
      belongs_to :customer
    end
    
    class OrdersController
    
      def index
        # determine the current customer (or admin), then
        if current_user.isAdmin?
          @orders = Order.all
        else
          @orders = current_user.orders
        end
      end
    end
    

    【讨论】:

    • 谢谢!我如何确定当前用户是管理员还是客户?使用像 acl9 这样的插件?
    • 您可以在用户模型中为此设置一个属性。像 user_type 一样说。
    【解决方案2】:

    @railsdog 是正确的,但是,这是难题的另一部分(如何首先在订单中获取客户的 ID):

    class OrdersController
      def create
        @order = Order.new(params[:order])
        @order.customer_id = current_user.id
        # ...
      end
      #...
    end
    

    这里注意在控制器中设置customer_id的方法,而不是从表单中。这样做的原因是,即使是隐藏的表单字段也可以由客户端更改,因此如果您在没有检查服务器端的情况下进行更改,攻击者可能会为其他客户下订单。

    【讨论】:

    • 谢谢您 - 让客户 ID 进入其中的一种方法是让客户登录/注册,然后将他们的 ID 传递到会话中?这个的语法是什么?
    猜你喜欢
    • 2018-08-26
    • 1970-01-01
    • 2013-04-01
    • 2015-02-14
    • 1970-01-01
    • 2022-07-11
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多