Rails маршрутизирует неопределенный метод

#ruby-on-rails #ruby #ruby-on-rails-5

#ruby-on-rails #ruby #ruby-on-rails-5

Вопрос:

Мой взгляд показывает ошибку метода:

Ошибка:

 NoMethodError in AdminsBackoffice::Administradores#edit
Showing C:/projetos/iRespostas/app/views/admins_backoffice/administradores/edit.html.erb where line #5 raised:

undefined method `admins_backoffice_path' for #<#<Class:0x00000000105edf70>:0x0000000011bc8728>
Did you mean?  admins_backoffice_welcome_index_path
Extracted source (around line #5):
             
</div>

<%= form_with(model: [ :admins_backoffice, @admin ], local: true) do |form| %>
    <div class="form-group">
        <%= form.label :email %>
        <%= form.text_field :email, class:"form-control", placeholder:"Email do administrador" %>
 

Мой код просмотра:

edit.html.erb

 <div class="d-sm-flex align-items-center justify-content-between mb-4">
   <h1 class="h3 mb-0 text-gray-800">Editar Administrador</h1>
</div>

<%= form_with(admin: [ :admins_backoffice, @admin ], local: true) do |form| %>
    <div class="form-group">
        <%= form.label :email %>
        <%= form.text_field :email, class:"form-control", placeholder:"Email do administrador" %>
    </div>
    
    <div class="form-group">
        <%= form.label :password %>
        <%= form.password_field :password, class:"form-control", placeholder:"Senha" %>
    </div>

    <div class="form-group">
        <%= form.label :password_confirmation %>
        <%= form.password_field :password_confirmation, class:"form-control", placeholder:"Confirmação da senha" %>
    </div>

    <button type="submit" class="btn btn-default">Salvar</button>
<% end %>
 

Мой код контроллера:

administradores_controller.rb

 class AdminsBackoffice::AdministradoresController < AdminsBackofficeController
  #efore_action :set_admin, only: [:show, :edit, :update]
  
  def index
    @admins = Admin.all
  end

  def show
    #
  end

  def edit
    #
  end

  def update
    #
  end


  private
    def set_admin
      @admin = Admin.find(params[:id])
    end
end
 

Мои маршруты:

routes.rb

 Rails.application.routes.draw do
  namespace :users_backoffice do
    get 'welcome/index'
  end

  namespace :site do
    get 'home/index'
  end

  namespace :admins_backoffice do
    get 'welcome/index' # Dashboard 
    resources :administradores, only: [:index, :edit, :update] # Administradores Controller CRUD
  end

  devise_for :users
  devise_for :admins

  root 'site/home#index'
end
 

Когда я меняю model of form_with(model: [ :admins_backoffice, @admin ], local: true) , страница загружается нормально, но href формы находится по той же ссылке, что и маршрут редактирования, который не работает.

 <form action="/admins_backoffice/administradores/19/edit" accept-charset="UTF-8" method="post">
 

Ответ №1:

При попытке использования form_with(model: ...) вы должны быть осторожны, чтобы следовать соглашениям Rails об именовании моделей, иначе методология может работать неправильно.

В случае вашего кода у вас есть концепция Administradores , подкрепленная моделью с другим именем — Admin . Таким образом, у Rails возникают проблемы с разрешением связи между ними при генерации маршрута из модели.

По сути, Rails запрашивает у вашего @admin объекта имя его модели, и он отвечает Admin , но ни один из ваших маршрутов не будет разрешен для admin маршрута.

Чтобы получить желаемое соединение между Administradores и Admin , вам нужно вручную переопределить имя модели в вашем models/admin.rb определении:

 class Admin < ApplicationRecord
  ...

  def self.model_name
    ActiveModel::Name.new(self, nil, "Administradore")
  end

  ...
end
 

Ответ №2:

Я не согласен с тем, что вам нужно исправить свой класс администратора. Вы можете просто указать опцию url в своем form_with

 <%= form_with(admin: [ :admins_backoffice, @admin ], local: true, url: admins_backoffice_administradore_path(@admin)) do |form| %>