Rails 5 множественных вложенных атрибутов нет Ошибка маршрутизации неинициализированная константа Сайты - PullRequest
0 голосов
/ 26 октября 2018

Здравствуйте, у меня есть небольшое приложение с тремя вложенными моделями: Client, Site и Damper.Когда я добавляю client или client_site, все нормально ... но когда я прихожу, чтобы добавить демпфер, я получаю

Routing Error
uninitialized constant Sites

в консоли

Started GET "/clients/1/sites/1/dampers/new" for my ip at 2018-10-26 18:05:29 +1000

ActionController::RoutingError (uninitialized constant Sites):

app/controllers/clients/sites/dampers_controller.rb:1:in `<main>'

Routes

resources :clients do
  resources :sites, controller: 'clients/sites' do
    resources :dampers, controller: 'clients/sites/dampers'
  end
end

Модели

app / models / client.rb

class Client < ApplicationRecord
  has_many :sites
end

app / models / site.rb

class Site < ApplicationRecord
  belongs_to :client
  has_many :dampers
end

app / models / damper.rb

class Damper < ApplicationRecord
  belongs_to :site
end

обратите внимание, что я допустил ошибку, и это было изначально: на сайтах, но даже после изменения эта ошибка осталась.

Контроллеры

приложение / контроллеры / clients_controller.rb

class ClientsController < ApplicationController
  before_action :set_client, only: [:show, :edit, :update, :destroy]

  # GET /clients
  # GET /clients.json
  def index
    @clients = Client.all
  end

  # GET /clients/1
  # GET /clients/1.json
  def show
    @client = Client.find(params[:id])
    @sites = @client.sites
  end

  # GET /clients/new
  def new
    @client = Client.new
  end

  # GET /clients/1/edit
  def edit
  end

  # POST /clients
  # POST /clients.json
  def create
    @client = Client.new(client_params)

    respond_to do |format|
      if @client.save
        format.html { redirect_to @client, notice: 'Client was successfully created.' }
        format.json { render :show, status: :created, location: @client }
      else
        format.html { render :new }
        format.json { render json: @client.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /clients/1
  # PATCH/PUT /clients/1.json
  def update
    respond_to do |format|
      if @client.update(client_params)
        format.html { redirect_to @client, notice: 'Client was successfully updated.' }
        format.json { render :show, status: :ok, location: @client }
      else
        format.html { render :edit }
        format.json { render json: @client.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /clients/1
  # DELETE /clients/1.json
  def destroy
    @client.destroy
    respond_to do |format|
      format.html { redirect_to clients_url, notice: 'Client was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_client
      @client = Client.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def client_params
      params.require(:client).permit(:name)
    end
end

приложение / контроллеры / клиенты / sites_controller.rb

class Clients::SitesController < ApplicationController
  before_action :set_client
  before_action :set_site, except: [:new, :create]

  # GET /sites
  # GET /sites.json
  def index
    @sites = Site.all
  end

  # GET /sites/1
  # GET /sites/1.json
  def show
    @client = Client.find(params[:client_id])
    @site = @client.sites.find(params[:id])
  end

  # GET /sites/new
  def new
    @site = Site.new
  end

  # GET /sites/1/edit
  def edit
  end

  # POST /sites
  # POST /sites.json
  def create
    @site = Site.new(site_params)
    @site.client = @client

    respond_to do |format|
      if @site.save
        format.html { redirect_to @client, notice: 'Site was successfully created.' }
        format.json { render :show, status: :created, location: @client }
      else
        format.html { render :new }
        format.json { render json: @client.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /sites/1
  # PATCH/PUT /sites/1.json
  def update
    respond_to do |format|
      if @site.update(site_params)
        format.html { redirect_to @client, notice: 'Site was successfully updated.' }
        format.json { render :show, status: :ok, location: @site }
      else
        format.html { render :edit }
        format.json { render json: @client.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /sites/1
  # DELETE /sites/1.json
  def destroy
    @site.destroy
    respond_to do |format|
      format.html { redirect_to sites_url, notice: 'Site was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_site
      @site = Site.find(params[:id])
    end

  def set_client
    @client = Client.find(params[:client_id])
  end

    # Never trust parameters from the scary internet, only allow the white list through.
    def site_params
      params.require(:site).permit(:name, :client_id)
    end
end

приложение / контроллеры / клиенты / сайты / увлажнители_контроллер.рб

class Sites::DampersController < ApplicationController
  before_action :set_client
  before_action :set_site
  before_action :set_damper, except: [:new, :create]

  # GET /dampers
  # GET /dampers.json
  def index
    @dampers = Damper.all
  end

  # GET /dampers/1
  # GET /dampers/1.json
  def show
  end

  # GET /dampers/new
  def new
    @damper = Damper.new
  end

  # GET /dampers/1/edit
  def edit
  end

  # POST /dampers
  # POST /dampers.json
  def create
    @damper = Damper.new(damper_params)
    @damper.site = @site

    respond_to do |format|
      if @damper.save
        format.html { redirect_to @site, notice: 'Damper was successfully created.' }
        format.json { render :show, status: :created, location: @site }
      else
        format.html { render :new }
        format.json { render json: @site.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /dampers/1
  # PATCH/PUT /dampers/1.json
  def update
    respond_to do |format|
      if @damper.update(damper_params)
        format.html { redirect_to @site, notice: 'Damper was successfully updated.' }
        format.json { render :show, status: :ok, location: @site }
      else
        format.html { render :edit }
        format.json { render json: @site.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /dampers/1
  # DELETE /dampers/1.json
  def destroy
    @damper.destroy
    respond_to do |format|
      format.html { redirect_to dampers_url, notice: 'Damper was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_damper
      @damper = Damper.find(params[:id])
    end
  def set_site
    @site = Site.find(params[:site_id])
  end
  def set_client
    @client = Client.find(params[:client_id])
  end

    # Never trust parameters from the scary internet, only allow the white list through.
    def damper_params
      params.require(:damper).permit(:location, :number, :site_id, :client_id)
    end
end

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

ActionController :: RoutingError (неинициализированные константы сайтов)

dampers_controller.rb находится под controllers/clients/sites, поэтому вам нужно изменить имя класса на

class Clients::Sites::DampersController < ApplicationController

вместо

class Sites::DampersController < ApplicationController

ради пространства имен

Также я рекомендую вам взглянуть на контроллер-пространства имен-и-маршрутизация * ** 1 022 * тысяча двадцать три

0 голосов
/ 26 октября 2018

Вы создали контроллер с именем Sites::DampersController, который является классом DampersController, определенным внутри пространства имен (модуль, класс, ...) с именем Sites, но вы забыли определить этот последний.

Вы можете создать это так:

module Sites
  class DampersController < ApplicationController
  end
end

Или просто избавиться от Sites:: части.

Вам также потребуется обновить маршруты, чтобы указать правильное имя контроллера.

В целом, проще следовать генерации маршрута по умолчанию для рельсов:

resources :clients do
  resources :sites do
    resources :dampers
  end
end

, который создаст маршруты, указывающие на следующие контроллеры:

  • ClientsController
  • SitesController
  • DampersController

Если вы действительно намерены поместить другие контроллеры в подпапки, следуя исходным маршрутам, вам необходимо определить следующее:

  • контроллер ClientsController
  • модуль Clients
  • контроллер SitesController внутри модуля Clients
  • модуль Sites внутри модуля Clients
  • контроллер DampersController внутри модуля Clients::Sites

Что для автозагрузки работ тоже должно быть организовано в подпапках:

  • приложение / контроллеры
    • clients_controllers.rb
    • клиенты /
    • sites__controllers.rb
    • сайты /
      • dampers_controllers.rb
...