Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何通过rails中的嵌套管线创建新对象?_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

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的答案,了解所需的关联