Итак, следуя путь я определил маршруты для моего приложения:Как создать новый объект через вложенные маршруты в рельсах?
Rails.application.routes.draw do
resources :operators do
resources :cabs
end
end
Как понял, мое приложение имеет несколько операторов кабины, и каждый оператор имеет определенное количество кэбов, связанное с ними:
class Operator < ActiveRecord::Base
has_many :cabs
end
проблема возникает, когда я пытаюсь создать новую кабину, как:
<%= link_to 'New Cab', new_operator_cab_path %>
новая форма создания кабины выглядит следующим образом:
<%= 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 по умолчанию (cabs_path) Wouldnt существует по пути были определены маршруты. Хотя мои ссылки работают нормально, но новая кабина не создается. Ниже мой cabs_controller:
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
Похоже, вы хотите использовать что-то вроде @ operator.cabs.build_cab (cab_params) Если вы хотите, чтобы оператор «имел» кабину. Ссылка Криса ответ на необходимые ассоциации – Peege151