【问题标题】:Rails has_many nested form No route matches [POST]Rails has_many 嵌套表单没有路由匹配 [POST]
【发布时间】:2015-01-23 19:23:45
【问题描述】:

我在提交嵌套表单时遇到上述错误,但我不知道如何解决。这是一些信息。确切的错误是No route matches [POST] "/vehicles/2/vehicle_records/new"。奇怪的是,当我运行 rake 路线时,路线存在我看到以下条目

/vehicles/:vehicle_id/vehicle_records/new(.:format)

车辆.rb

class Vehicle < ActiveRecord::Base
  has_many :vehicle_records,  dependent: :destroy
  accepts_nested_attributes_for :vehicle_records
end

vehicle_record.rb

class VehicleRecord < ActiveRecord::Base
  belongs_to :vehicle
end

我希望能够添加从车辆展示视图链接的车辆维护记录。

views/vehicle/show.html.erb

<h3><b>Vehicle ID:</b> <%= @vehicle.id %></h3>

<p><b>Year:</b> <%= @vehicle.year %></p>

<p><b>Make:</b> <%= @vehicle.make %></p>
<p><b>Model:</b> <%= @vehicle.model %></p>
<p><b>Work Last Performed:</b> <%= @vehicle.make %></p>


<h2>Maintenance Record</h2>
<table>
  <tr>
    <th>Date Performed</th>
    <th>Mileage</th>
    <th>Hours</th>
    <th>Work Performed</th>
  </tr>
  <% @vehicle.vehicle_records.each do |vr|%>
    <tr>
      <td><%= vr.date_performed %></td>
      <td><%= vr.mileage %></td>
      <td><%= vr.hours %></td>
      <td><%= vr.work_performed %></td>
    </tr>
  <% end %>
</table>

<%= link_to "Add Maintenance Record", new_vehicle_vehicle_record_path(@vehicle) %>

然后我链接到 vehicle_record 新表单

views/vehicle_records/new.html.erb

<%= form_for :vehicle_record do |vr| %>
  <p>
    <%= vr.label :date_performed%><br />
    <%= vr.text_field :date_performed%>
  </p>
  <p>
    <%= vr.label :mileage%><br />
    <%= vr.text_field :mileage%>
  </p>
  <p>
    <%= vr.label :mileage%><br />
    <%= vr.text_field :mileage%>
  </p>
  <p>
    <%= vr.label :hours%><br />
    <%= vr.text_field :hours%>
  </p>
  <p>
    <%= vr.label :work_performed%><br />
    <%= vr.text_area :work_performed%>
  </p>

  <p><%= vr.submit "Create Record" %></p>

我的车辆记录控制器如下

vehicle_records_controller.rb

class VehicleRecordsController < ApplicationController

  def new
    @vehicle_record = VehicleRecord.new
  end

  def create
    @vehicle_record = VehicleRecord.new(params[:vehicle_record])

    if @vehicle_record.save
      redirect_to vehicles_path
    else
      flash[:notice] = "Not Saved"
    end
  end
end

routes.rb

resources :vehicles do
  resources :vehicle_records
end

【问题讨论】:

  • 请将您的 routes.rb 文件添加到问题中,请

标签: ruby-on-rails forms ruby-on-rails-3 nested-attributes


【解决方案1】:

更新:无嵌套表单

所以我听说您只想编辑 vehicle_report 而不接触 vehicle。由于您已经将 vehicle_report 作为嵌套资源,您可以按如下方式修改控制器:

class VehicleRecordController < ApplicationController
  ...

  def new
    @vehicle = Vehicle.find params[:vehicle_id]
    @vehicle_record = @vehicle.vehicle_records.build
  end

  ...
end

create 方法的内容相当简单。然后您必须将表单更改为:

<%= form_for @vehicle_record do |v| %>
  ...
  <%= # vehicle record attributes %>
  ...
  <%= v.submit "Submit" %>

你很高兴!

原始答案:带嵌套表单

首先,我没有看到您使用任何嵌套表单。其次,我看不到您的vehicle_record 表单如何知道它实际上属于哪个vehicle(请参阅您的控制器)。在我看来,最简单的方法是允许使用nested formsvehicles/:id/editvehicles/new 中直接添加和删除vehicle_records

<%= form_for @vehicle do |v| %>
  ...
  <%= # vehicle attributes here %>
  ...
  <%= v.fields_for :vehicle_records do |vr| %>
    ...
    <%= # vehicle record attributes %>
    ...
  <%= v.submit "Submit" %>

对于现有的vehiclesfields_for 将呈现所有现有vehicle_records 的列表,对于新的,您可以在控制器中使用以下代码使fields_for 呈现例如三个空vehicle_records

class VehicleController < ApplicationController
  ...

  def new
    @vehicle = new Vehicle
    3.times { @vehicle.vehicle_records.build }
  end

  ...
end

如果您希望每次编辑现有的vehicle 时始终拥有多个免费的vehicle_records,您可以使用类似的方法进行编辑并重复使用上述表单:

class VehicleController < ApplicationController
  ...

  def edit
    @vehicle = Vehicle.find params[:id]
    # Add one blank vehicle record to existing ones
    # This is also rendered by fields_for
    @vehicle.vehicle_records.build
  end

  ...
end

【讨论】:

  • 我相信我的想法是,由于车辆一旦创建就不需要更新,添加维护记录条目会更好地位于车辆的显示视图中。嵌套表单还具有打开每个车辆记录进行编辑的缺点,这会引入潜在的用户错误。这就是为什么我想将车辆记录表格放在它自己的视图中,这样我一次只能创建/编辑一个条目。
  • 您的代码所做的只是创建不属于任何车辆的记录!如果您只想编辑记录,您真的不需要将记录作为车辆的嵌套资源。
  • 谢谢。这很有帮助。能够将车辆 ID 传递给记录控制器以创建没有嵌套表单的记录。我以前用过嵌套资源,但我想我并没有完全理解它的具体用途
  • @ctilley79 我为您推荐一个新的解决方案。希望它最终能解决你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2021-07-15
  • 2014-09-27
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多