在放置时将customer_id添加到订单,在客户索引中检索它

时间:2012-06-12 11:24:51

标签: ruby-on-rails ruby database controller

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

这可能是一个非常简单的问题,道歉!但我是铁杆新手,无法弄清楚如何开始这个。有人可以建议我这样做吗?

编辑:

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

2 个答案:

答案 0 :(得分:0)

如果您创建订单表以拥有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

答案 1 :(得分:0)

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

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

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