5

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

大多数情况下它都在工作,除了发生这种情况:

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

我真正需要发生的是:

  1. 管理员用户转到 new_purchase_path
  2. 然后应用程序使用购买控制器中的“创建”操作
  3. 然后应用程序使用购买控制器中的“新”操作
  4. 然后应用程序呈现“应用程序/购买/新”视图
  5. 管理员创建订单后,应用程序使用购买控制器呈现“app/purchases/show”视图

在 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,没有任何类似的记录,自然它不起作用。我能做些什么?

4

2 回答 2

3

几点观察:

  1. 您不应在新操作中使用 *respond_with*,因为它对 HTML 以外的任何内容都没有意义。
  2. 如果您只想为管理员制作一些控制器,则应该使用命名空间。请参阅http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing。这样您也不需要更改名称。
于 2012-12-03T12:04:27.023 回答
2

这个问题的答案与你上一个问题有关。我已经在那里更新了我的答案,但简而言之,问题不在于respond_with(正如@jiri-pospisil 指出你并不真正需要),而是你的表单由simple_form_for. 该表单中的操作 url 默认为/orders因为@purchase是 class 的一个实例Order

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

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

然后你会发现你还有一个问题:新订单(购买)创建后,respond_with会重定向showOrdersController. 要解决此问题,您可以使用以下location选项:

def create
  @purchase = Order.new(params[:purchase])
  if @purchase.save
    respond_with(@purchase, :location => purchases_path(@purchase))
    ...

正如您现在可能知道的那样,以这种方式为单个模型使用两个控制器变得有些复杂,因此您可能需要考虑命名空间

于 2012-12-03T12:50:02.960 回答