2014-11-09 2 views
0

Итак, следуя путь я определил маршруты для моего приложения:Как создать новый объект через вложенные маршруты в рельсах?

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 
+0

Похоже, вы хотите использовать что-то вроде @ operator.cabs.build_cab (cab_params) Если вы хотите, чтобы оператор «имел» кабину. Ссылка Криса ответ на необходимые ассоциации – Peege151

ответ

0

Несколько вопросов и указатели:

  • включают ли ваша модель Cab belongs_to :operator, а также operator_id столбец целого типа?
  • Вашему new_operator_cab_path необходимо сообщить, к кому принадлежит оператор, например: new_operator_cab_path(@operator).
  • Та же проблема, что и выше, существует в вашей форме URL: @cab, url: operator_cabs_path. В этом случае вы можете просто исправить это, заменив его [@cab.operator, @cab], который Rails переведет на соответствующий URL-адрес.
  • Поскольку это вложенный ресурс, вы захотите построить свои новые кабины немного по-другому. Вместо Cab.new в ваших новых и создайте действия, вы хотите использовать Operator.find(params[:operator_id]).cabs.build. Это специально построит такси, принадлежащее вашему оператору.

Вот некоторые ресурсы, которые могут оказаться полезными:

+0

Спасибо Крис ... хорошо работает! –

Смежные вопросы