5

私は注文モデルを持っています。顧客は、Orders コントローラーを介して Order モデルと対話します。管理者は、購入コントローラーを介して注文モデルと対話します。

これが起こることを除いて、ほとんどは機能しています:

  1. 管理者ユーザーは new_purchase_path に移動します
  2. 予想どおり、アプリは購入コントローラーで「作成」アクションを使用します
  3. 次に、アプリは注文コントローラーで「新規」アクションを使用します (購入コントローラーではありません)。
  4. 次に、注文コントローラーの使用に切り替えたにもかかわらず、アプリは「app/purchases/new」ビュー (「app/orders/new」ビューではなく) をレンダリングします。
  5. 管理者が注文を作成した後、アプリは注文コントローラーを使用して「app/orders/show」ビューをレンダリングします

私が本当に起こる必要があるのはこれです:

  1. 管理者ユーザーは new_purchase_path に移動します
  2. 次に、アプリは購入コントローラーで「作成」アクションを使用します
  3. 次に、アプリは purchases コントローラーで「new」アクションを使用します
  4. 次に、アプリは「app/purchases/new」ビューをレンダリングします
  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. HTML 以外では意味がないため、新しいアクションで *respond_with* を使用しないでください。
  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ためです。@purchaseOrder

この問題を解決するには、次の形式で URL を指定します。

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

次に、別の問題があることがわかります。新しい注文 (購入) が作成された後、は のアクションにrespond_withリダイレクトされます。これを修正するには、次のオプションを使用できます。showOrdersControllerlocation

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

この時点でおそらくわかるように、この方法で 1 つのモデルに 2 つのコントローラーを使用するとやや複雑になるため、代わりに名前空間を検討することをお勧めします。

于 2012-12-03T12:50:02.960 に答える