如何在Rails中使用两个带有一个模型的控制器

时间:2012-12-03 11:29:41

标签: ruby-on-rails

我有一个订单模型。客户通过Orders控制器与Order模型进行交互。管理员通过“购买”控制器与订单模型进行交互。

除了发生这种情况之外,它大部分都在工作:

  1. 管理员用户转到new_purchase_path
  2. 该应用使用购买控制器中的“创建”操作,如     预期
  3. 然后应用程序在订单控制器中使用“新”操作(而不是 购买控制器)
  4. App然后呈现“app / purchases / new”视图(不是 “app / orders / new”视图,尽管已经切换到使用订单控制器
  5. 管理员创建订单后,应用程序然后呈现 使用订单控制器的“app / orders / show”视图
  6. 我真正需要做的是:

    1. 管理员用户转到new_purchase_path
    2. 该应用程序然后使用购买控制器中的“创建”操作
    3. 该应用程序然后使用购买控制器中的“新”操作
    4. 该应用随后呈现“app / purchases / new”视图
    5. 管理员创建订单后,应用程序然后呈现 使用购买控制器的“app / purchases / show”视图
    6. 在app / controllers / purchases_controller.rb中我有这个:

        def new
          @purchase = Order.new
          respond_with @purchase
        end
      

      如果尝试了类似的变体......

        def new
          @purchase = Order.new
          respond_with @purchase, :controller => :purchases
        end
      

      ...但是对于respond_with,没有记录任何类似的东西,自然它不起作用。我该怎么办?

2 个答案:

答案 0 :(得分:3)

一些观察结果:

  1. 您不应在新操作中使用* respond_with *,因为除了HTML之外的其他任何内容都没有意义。
  2. 如果您只想为管理员制作一些控制器,则应该使用命名空间。见http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing。这样你也不需要更改名称。

答案 1 :(得分:2)

此问题的答案与您的last question有关。我已经更新了my answer there,但简而言之,问题不在于respond_with(正如@ jiri-pospisil指出的那样,你真的不需要)但是你的表单生成了按simple_form_for。该表单中的操作网址默认为/orders,因为@purchase是类Order的实例。

要解决该问题,请在表单中指定网址:

= simple_form_for @purchase, :as => :purchase, :url => purchases_path(@purchase) do |f|
  = f.error_notification
  = f.input :name
  = f.button :submit

然后您会发现还有其他问题:创建新订单(购买)后,respond_with会重定向到show的{​​{1}}操作。要解决此问题,您可以使用OrdersController选项:

location

正如您可能已经知道的那样,对于单个模型使用两个控制器会变得有些复杂,因此您可能需要考虑使用namespaces