Фон
Внутри моего приложения серия состоит из множества книг . Страница Показать серию позволяет пользователю просмотреть все книги серии и добавить новую книгу в серию с помощью формы.
Каждая книга, указанная на странице Show , имеет ссылку на страницу Edit для этой книги. Страница редактирования содержит ту же форму , которая использовалась для первоначального добавления книги. При редактировании книги форма должна автоматически заполняться существующей информацией о книгах.
Вопрос
Как настроить мой тег form_with
, чтобы он мог одновременно создавать новую книгу и редактировать существующую книгу (автоматически заполняя форму редактирования)? Я пробовал следующие конфигурации, но они либо ломают страницу редактирования, либо ломают страницу показа:
<%= form_with(model: [ @series, @series.books.build ], local: true) do |form| %>
- Книга перерывов Страница редактирования
- Ошибка: ошибка отсутствует, но форма не заполняется автоматически
<%= form_with(model: @book, url: series_book_path, local: true) do |form| %>
- Перерывы серии Показать страницу
- Ошибка:
No route matches {:action=>"show", :controller=>"books", :id=>"6"}, missing required keys: [series_id]
<%= form_with(model: [:series, @book], local: true) do |form| %>
- Перерывы серии Показать страницу
- Ошибка:
Undefined method 'model_name' for nil:NilClass
<%= form_with(model: [@series, @series.books.find(@book.id)], local: true) do |form| %>
- Перерывы серии Показать страницу
- Ошибка:
undefined method 'id' for nil:NilClass
<%= form_with(model: @book, url: [@series, @book], local: true) do |form| %>
- Перерывы при подаче новой книги в сериал Показать страницу
- Ошибка:
No route matches [POST] "/series/6"
Ресурсы, с которыми я консультировался:
Существующий код
Ниже приведены сокращенные разделы соответствующего кода, а также ссылки на то, где они существуют в моем текущем репозитории GitHub.
конфиг / routes.rb
resources :series do
resources :books
end
приложение / модели / book.rb
class Book < ApplicationRecord
belongs_to :series
end
приложение / модели / series.rb
class Series < ApplicationRecord
has_many :books, dependent: :destroy
end
дб / schema.rb
create_table "books", force: :cascade do |t|
t.integer "series_number"
t.integer "year_published"
t.integer "series_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["series_id"], name: "index_books_on_series_id"
end
create_table "series", force: :cascade do |t|
t.string "title"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
приложение / просмотров / серия / show.html.erb
<%= render @series.books %>
<%= render 'books/form' %>
приложение / просмотров / книги / _book.html.erb
<%= link_to 'Edit', edit_series_book_path(book.series, book) %>
приложение / просмотров / книги / edit.html.erb
<%= render 'form' %>
приложение / просмотров / книги / _form.html.erb
<%= form_with(model: @book, url: [@series, @book], local: true) do |form| %>
<%= form.label :series_number %>
<%= form.number_field :series_number %>
<%= form.label :year_published %>
<%= form.number_field :year_published %>
<% end %>
приложение / контроллеры / books_controller.rb
class BooksController < ApplicationController
def index
@books = Book.all
end
def show
@book = Book.find(params[:id])
end
def new
@book = Book.new
end
def edit
@series = Series.find(params[:series_id])
@book = @series.books.find(params[:id])
end
def create
@series = Series.find(params[:series_id])
@book = @series.books.create(book_params)
redirect_to series_path(@series)
end
def destroy
@series = Series.find(params[:series_id])
@book = @series.books.find(params[:id])
@book.destroy
redirect_to series_path(@series)
end
private
def book_params
params.require(:book).permit(:year_published, :series_number)
end
end
Маршруты
Prefix Verb URI Pattern Controller#Action
articles GET /articles(.:format) articles#index
POST /articles(.:format) articles#create
new_article GET /articles/new(.:format) articles#new
edit_article GET /articles/:id/edit(.:format) articles#edit
article GET /articles/:id(.:format) articles#show
PATCH /articles/:id(.:format) articles#update
PUT /articles/:id(.:format) articles#update
DELETE /articles/:id(.:format) articles#destroy
series_books GET /series/:series_id/books(.:format) books#index
POST /series/:series_id/books(.:format) books#create
new_series_book GET /series/:series_id/books/new(.:format) books#new
edit_series_book GET /series/:series_id/books/:id/edit(.:format) books#edit
series_book GET /series/:series_id/books/:id(.:format) books#show
PATCH /series/:series_id/books/:id(.:format) books#update
PUT /series/:series_id/books/:id(.:format) books#update
DELETE /series/:series_id/books/:id(.:format) books#destroy
series_index GET /series(.:format) series#index
POST /series(.:format) series#create
new_series GET /series/new(.:format) series#new
edit_series GET /series/:id/edit(.:format) series#edit
series GET /series/:id(.:format) series#show
PATCH /series/:id(.:format) series#update
PUT /series/:id(.:format) series#update
DELETE /series/:id(.:format) series#destroy