#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| %>