1

在我的 Ruby on Rails 应用程序中,每个组都有_many :expenses。我已经嵌套了路线,因此费用仅作为其父组的子实体输入。这是 routes.rb 的摘录。

resources :groups do
    resources :expenses
end

如果通过 /groups/:group_id/expenses/new 提交的费用未节省,我无法弄清楚如何呈现“新”操作。在我的费用_controller.rb 中,创建操作的定义如下:

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

看起来您需要在视图中明确指定 form_for 的 url。

像……</p>

<%= form_for @expense, :url => group_expenses_path(@group.id) do |f| %>
  ...
<% end %>
于 2012-04-29T02:07:56.227 回答
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

在您<%= form_for %>使用@group的网址中,因为费用属于_to 组。但是在控制器中的 create 操作中,您还没有定义什么是@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 回答