1

私の Ruby on Rails アプリケーションでは、各グループには多くの費用が含まれています。ルートをネストしたので、経費は親グループの子エンティティとしてのみ入力されます。これは routes.rb からの抜粋です。

resources :groups do
    resources :expenses
end

/groups/:group_id/expenses/new から送信された経費が保存されない場合に、「新規」アクションをレンダリングする方法がわかりません。私のexpenses_controller.rbでは、createアクションがどのように定義されているかを以下に示します:

def create
    @expense = Expense.new(params[:expense])
    @expense.group_id = params[:group_id]
    if @expense.save
      redirect_to group_expense_path(@expense.group.id, @expense.id)
    else
      render 'new'
    end
end

経費の検証に満足し、@expense.save が機能するようになると、すべてが正常に機能します。ただし、失敗してコードが「新規」をレンダリングしようとすると、次のようになります。

undefined method `expenses_path' for #<#<Class:0x007fd408b1fd58>:0x007fd408f21ca8>

したがって、ネストされたルーティングについて何か問題があると思います。ユーザーを新しいフォームに戻し、最初に送信しようとしたデータのエラーを flash[] パラメーターを介して表示するにはどうすればよいですか?

4

3 に答える 3

0

問題は@group初期化されていないことです

したがって、コントローラーで次のようにします

@expense = Expense.new(params[:expense])
@group = Group.find(params[:group_id])
@expense.group_id = @group.id
于 2012-04-29T02:18:35.263 に答える
0

費用はグループに属しているため、あなたはURLに使用しました<%= form_for %>@groupしかし、コントローラーの作成アクション内では、何を定義していない@groupので、最初に次のように定義する必要があります。

@expense = Expense.new(params[:expense])
@group = Group.find(params[:group_id])
@expense.group_id = @group.id

また、コントローラーで使用することをお勧めしrespond_toます:

respond_to do |format|
  if @expense.save
    format.html { redirect_to group_expense_path(@group.id, @expense.id), :notice => "Any msg you want" }
  else
    format.html { render :action => "new" }
  end
end

これらはすべて、コントローラー内の作成アクションにあります。
また、さまざまなレンダリング方法については、http: //guides.rubyonrails.org/layouts_and_rendering.html

を参照してください 。

于 2012-04-29T05:40:24.777 に答える
0

ビューで form_for の URL を明示的に指定する必要があるようです。

みたいな…</p>

<%= form_for @expense, :url => group_expenses_path(@group.id) do |f| %>
  ...
<% end %>
于 2012-04-29T02:07:56.227 に答える