0

したがって、Reports と Receipts の 2 つのモデルがあります。各レポートには多くの領収書があります。私は足場を使用してすべてのビューやものを生成しましたが、ユーザーが新しいレポートを作成または編集するときに、フォームで領収書を作成および編集できるように変更しています。

私のモデルはセットアップされています:

class Report < ActiveRecord::Base

    has_many :receipts, :dependent => :destroy
  accepts_nested_attributes_for :receipts, :allow_destroy => true

    attr_protected :id

end
class Receipt < ActiveRecord::Base
    belongs_to :report

    attr_protected :id

    validates_presence_of :vendor, :date, :description, :amount, :acctCode
end

新しい領収書を作成するためのフォームを設定しました。

    <%= form_for @report do |f| %>
     ....
       <%= f.fields_for :receipts, Receipt.new do |receipt| %>
       ...
       <% end %>
    <% end %>

しかし、レポートを保存するたびに、ルーティング エラーが発生します。

No route matches {:action=>"edit", :controller=>"receipts", :report_id=>#<Receipt id: nil, date: nil, vendor: "", description: "", amount: nil, companyCard: false, lobbyingExpense: false, acctCode: "", created_at: nil, updated_at: nil, report_id: 2>}

私のルートは次のように設定されています:

resources :reports do
    resources :receipts
end

領収書のコントローラーには

  # GET /receipts/new
  def new
    @receipt = Receipt.new

    respond_to do |format|
      format.html # new.html.erb
    end
  end

  # GET /receipts/1/edit
  def edit
    @receipt = Receipt.find(params[:id])
  end

  # POST /receipts
  def create
    @receipt = Receipt.new(params[:receipt])

    respond_to do |format|
      if @receipt.save
        format.html { redirect_to @receipt.Report, notice: 'Receipt was successfully created.' }
      else
        format.html { render action: "new" }
      end
    end
  end

しばらくレールに触れていないので、何が間違っているのかわかりません。しかし、私の古いアプリ (3.1) では、ブログの投稿に画像を追加したときに、ajax を介して画像を削除する以外に、画像のコントローラーさえありませんでした。ここでレシート用のコントローラーを用意した唯一の理由は、ビューなどを生成するために scaffold を使用したからです。

編集 - 新しいレシート ビューに移動すると、フォーム タグでエラーが発生することも指摘しておく必要があります。

<%= form_for(@receipt) do |receipt| %>

undefined method `receipts_path'
4

2 に答える 2

1

を使用している場合accepts_nested_attributes_for、レコードを管理するために追加のコントローラーは必要ありません。もちろん、領収書の「表示ビュー」などの特定のページが必要な場合は、そのコントローラーが必要です。

あなたaccepts_nested_attributes_forが必要とするために:

  1. レポートのフォーム
  2. fields_for :receiptsその形で使う

このようにして、特定のレポートに対して作成されたすべての領収書を編集できます。新しい領収書も作成したい場合は、空白の領収書を追加できます: @report.receipts.build. この呼び出しをnewandeditアクションに追加できます。

レポートのフォームで領収書を編集することに注意してください。ReportsControllerこれは、 ではなくを押す必要があることを意味しますReceiptsController

ここでうまくいかない場合は、デバッグのアドバイスがあります。

  • rake routes を実行して、すべてが正しく定義されているかどうかを確認します。
  • から生成された HTML を検査しますform_for(@report)。特に form タグの 'action=""' 属性が関連しています。「/reports/X」を指す必要があります

編集:ネストされたフォームを機能させるために、関連するすべてのファイルを含む Gist を作成しました: https://gist.github.com/4420280

于 2012-12-31T14:37:17.727 に答える
0

ネストされたリソース フォームの cocoon gem をチェックアウトします。この gem により、ネストされたリソースを扱う作業が非常に簡単になりました。https://github.com/nathanvda/cocoon

于 2013-01-03T19:26:00.690 に答える