Ruby on rails 如何通过rails中的嵌套管线创建新对象?
下面是我为我的应用程序定义路由的方法:Ruby on rails 如何通过rails中的嵌套管线创建新对象?,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,下面是我为我的应用程序定义路由的方法: Rails.application.routes.draw do resources :operators do resources :cabs end end 据了解,我的应用程序有几个驾驶室操作员,每个操作员都有一定数量的驾驶室: class Operator < ActiveRecord::Base has_many :cabs end 当我试图创建一个新的cab时,出现了以下问题: <%= link_t
Rails.application.routes.draw do
resources :operators do
resources :cabs
end
end
据了解,我的应用程序有几个驾驶室操作员,每个操作员都有一定数量的驾驶室:
class Operator < ActiveRecord::Base
has_many :cabs
end
当我试图创建一个新的cab时,出现了以下问题:
<%= link_to 'New Cab', new_operator_cab_path %>
新的cab创建表单如下所示:
<%= form_for @cab, url: operator_cabs_path, method: :post do |f| %>
<% if @cab.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@cab.errors.count, "error") %> prohibited this cab from being saved:</h2>
<ul>
<% @cab.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :category %><br>
<%= f.text_field :category %>
</div>
<div class="field">
<%= f.label :number %><br>
<%= f.text_field :number %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
我必须在表单中明确定义url和方法,因为根据路由的定义方式,默认url路径不存在。
虽然我的链接工作正常,但没有创建新的cab。以下是我的驾驶室控制器:
class CabsController < ApplicationController
before_action :set_cab, only: [:show, :edit, :update, :destroy]
# GET /cabs
# GET /cabs.json
def index
@cabs = Operator.find(params[:operator_id]).cabs
end
# GET /cabs/1
# GET /cabs/1.json
def show
end
# GET /cabs/new
def new
@cab = Cab.new
@operator = Operator.find(params[:operator_id])
end
# GET /cabs/1/edit
def edit
@operators = Operator.all
end
# POST /cabs
# POST /cabs.json
def create
@cab = Cab.new(cab_params)
respond_to do |format|
if @cab.save
format.html { redirect_to operator_cabs_path, notice: 'Cab was successfully created.' }
format.json { render :show, status: :created, location: @cab }
else
format.html { render :new }
format.json { render json: @cab.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /cabs/1
# PATCH/PUT /cabs/1.json
def update
respond_to do |format|
if @cab.update(cab_params)
format.html { redirect_to operator_cabs_path(operator_id: @operator.id), notice: 'Cab was successfully updated.' }
format.json { render :show, status: :ok, location: @cab }
else
format.html { render :edit }
format.json { render json: @cab.errors, status: :unprocessable_entity }
end
end
end
# DELETE /cabs/1
# DELETE /cabs/1.json
def destroy
@cab.destroy
respond_to do |format|
format.html { redirect_to operator_cabs_path(operator_id: @operator.id), notice: 'Cab was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_cab
@cab = Cab.find(params[:id])
@operator = Operator.find(params[:operator_id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def cab_params
params.require(:cab).permit(:category, :number)
end
end
一些问题和建议: 您的Cab型号是否包括“属于”\u to:运算符以及整型运算符id列? 您的新的\u操作符\u cab\u路径需要被告知cab属于哪个操作符,如下所示:new\u operator\u cab_path@operator. 您的表单URL:@cab,URL:operator\u cabs\u path中存在与上述相同的问题。在这种情况下,您只需将其替换为[@cab.operator,@cab],Rails就会将其转换为适当的URL。 因为这是一个嵌套的资源,所以您将希望以稍微不同的方式构建新的CAB。您需要使用Operator.findparams[:Operator\u id].cabs.build,而不是new和create操作中的Cab.new。这将专门为您的操作员建造一个驾驶室。 以下是一些您可能会发现有用的相关资源:
如果您希望操作员“拥有”驾驶室,听起来您需要使用@operator.cabs.build_cabcab_params之类的参数。参考Chris的答案,了解所需的关联