1

Orderモデルがあります。

顧客は、すべてOrdersコントローラーによってサポートされている、独自の注文を作成および表示できる、消費者に優しいビューをいくつか取得します。

管理者は、購入コントローラーに支えられて、注文を作成、編集、表示、削除、および管理するためのすべてのビューを取得します。

私の知る限り、PurchasesコントローラーはOrderモデルとのみ通信する必要がありますが、次のエラーメッセージにより、存在しないPurchaseモデルを探していると思われます。

ActiveRecord::StatementInvalid in PurchasesController#new
NameError in PurchasesController#new
uninitialized constant Purchase
Rails.root: /Users/steven/Dropbox/testivate

それはエラーの意味ですか?もしそうなら、PurchasesコントローラーがPurchaseモデルを見つけようとするのを止めるにはどうすればよいですか?

私のコード...

app / controllers / purchases_controller.rb:

class PurchasesController < ApplicationController
  def new
    @purchase = Order.new
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @purchase }
    end
  end
  def create
    @purchase = Order.new(params[:purchase])
    respond_to do |format|
      if @purchase.save
        format.html { redirect_to purchase_path(@purchase), notice: 'Purchase was successfully created.' }
        format.json { render json: @purchase, status: :created, location: @purchase }
      else
        format.html { render action: "new" }
        format.json { render json: @purchase.errors, status: :unprocessable_entity }
      end
    end
  end
end

/config/routes.rb:

Testivate::Application.routes.draw do
  resources :orders
  resources :purchases
end

/app/views/purchases/new.html.haml:

.textbox
  %p#notice= notice
  %h1 New Purchase
  = render 'form'
  = link_to 'List Purchases', purchases_path

/app/views/purchases/_form.html.haml:

= simple_form_for @purchase do |f|
  = f.error_notification
  = f.input :name
  = f.button :submit

更新:「transaction」はRailsの予約語であることに気付いたので、これを変更しました。しかし、他に修正する必要があるものはありますか?

*更新2: #newビューと_formを完全にコメントアウトしても、エラーが発生するので、問題はコントローラーやルート、またはsimple_formの使用以外の場所にあると思います。*

4

1 に答える 1

0

アップデート:

これが答えの半分です。残りの半分については、質問に対するコメントを参照してください。

元の答え:

ここでの問題の一部は、デフォルトでform_for(simple_form_for上に構築されている) が、特定のレコードに使用するパスについて特定のことを想定していることです。これは、そのレコードのクラスから派生します。あなたの場合、@purchase実際にはOrderクラスのインスタンスであるため、これらの仮定はあなたのために物事を台無しにするでしょう.

によって生成されたフォームを見ると、フォームに の id とクラスの両方が与えられ、フォーム内のフィールドに のような名前が付けられてsimple_form_forいることがわかります。フォームの代わりにレールを使用するには、レールにオプションを渡す必要があります。new_orderorder[name]purchaseorder:as

ドキュメントからform_for

Client として機能する Person のように、別のパラメータとして表す必要があるオブジェクトがある場合:

そして彼らが与える例:

<%= form_for(@person, :as => :client) do |f| %>
  ...
<% end %>

あなたの場合、実際に@purchaseは「購入」のように扱うように指示したいと思うでしょう:

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

これにより、フォームIDなどが正しく取得されるため、たとえばparams[:purchase]、上記のように作成アクションで使用できます。しかし、これでは十分ではありません。フォームのアクション (URL) は依然として/orders. それを変更するには、:urlオプションを追加します。

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

これにより、投稿した他の質問も解決されます。

于 2012-12-03T04:06:11.073 に答える