Rails form_for错误|如何将嵌套的ActiveRecord对象绑定到表单

时间:2015-07-12 11:49:04

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我正在开发Ruby on Rails应用程序。它有一个嵌套的路由,如:

Rails.application.routes.draw do
  root 'trip_plans#index'
  resources :trip_plans do
    resources :places, except: [:show, :index]
  end
end

trip_plans资源具有TripPlan模型,places资源具有Place模型。根据路线,new_trip_plan_place_path/trip_plans/:trip_plan_id/places/new之类的路线。 views/places/new.html.haml使用form_for声明在当前trip_plan内创建新地点:

- content_for :title do
  %title Add a Place to Your Plan

%header.form-header
  .container.form-container
    .row
      .col-xs-12
        %h1 Add a Place
        %hr

%article
  %section
    .container.form-container
      = render 'form'

相应的edit.html.haml基本相同,调用相同的_form.html.haml来呈现表单。

places_controller newedit行为就像:

def new
  @trip_plan = TripPlan.find(params[:trip_plan_id])
  @place = @trip_plan.places.build
end

def edit
  @trip_plan = TripPlan.find(params[:trip_plan_id])
  @place = @trip_plan.places.build
end

_form.html.haml使用@place就像这样:

= form_for @place do |f|

但由于@place是依赖的ActiveRecord对象,因此Rails无法确定newedit路径的正确网址。它始终在edit页面上显示新表单。

我该如何解决这个问题?

提前致谢!

1 个答案:

答案 0 :(得分:1)

  

即使在编辑页面上也始终显示新表格

我想问题是@place = @trip_plan.places.build方法中的这一行edit

@place = @trip_plan.places.build只是@place = @trip_plan.places.new,因此 Rails 会将@place视为 新实例< / em> 即使在 编辑表单

将其更改为@place = Place.find(params[:id])可以解决您的问题。

<强> 更新

您还应该更改以下内容

= form_for @place do |f|

= form_for [@trip_plan, @place] do |f|