【问题标题】:Rendering new form for a nested Ruby on Rails Resource为嵌套的 Ruby on Rails 资源渲染新表单
【发布时间】:2014-03-04 06:23:55
【问题描述】:

在我的 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[] 参数向他/她显示他们最初尝试提交的数据的错误?

【问题讨论】:

  • 你能添加你的视图代码吗?
  • 当然。它是

    禁止节省这笔费用:

    ... 表单控件 ...

标签: ruby-on-rails ruby rails-routing


【解决方案1】:

问题是@group没有初始化

所以在你的控制器中就可以了

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

【讨论】:

    【解决方案2】:

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

    有点像……

    <%= form_for @expense, :url => group_expenses_path(@group.id) do |f| %>
      ...
    <% end %>
    

    【讨论】:

      【解决方案3】:

      在您的&lt;%= form_for %&gt; 中,您使用了@group 作为网址,因为费用属于_to 组。但是在控制器的创建操作中,您还没有定义@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

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        相关资源
        最近更新 更多