Метод params.require
требует, чтобы ключ books
присутствовал в хэше - если нет, то он вызывает исключение ActionController::ParameterMissing
.
Чтобы вложить входные данные, их необходимо соответствующим образом назвать:
<%= form_tag("/insert", method: "post") do %>
<%= label_tag("Title") %>
<%= text_field_tag("books[title]") %><br>
<%= label_tag("Price") %>
<%= number_field_tag("books[price]") %
...
<%= submit_tag("Submit") %>
<% end %>
Это даст хэш параметров:
{ books: { title: 'Life & Times of Michael K', price: 99 } }
Однако это довольно утомительно.Лучше всего использовать помощники по формам и настроить маршруты и контроллер в соответствии с соглашениями:
# config/routes.rb
resources :books
# app/views/books/new.html.erb
<%= form_for(@book) do |f| %>
<div class="field">
<%= f.label :title %>
<%= f.text_field :title %>
</div>
# ...
<%= f.submit %>
<% end %>
# app/controllers/books_controller.rb
class BooksController < ApplicationController
# this renders the form to create a new book
# GET /books/new
def new
@book = Book.new
end
# In Rails its called create - not insert
# POST /books
def create
@book = Book.new(book_params)
if @book.save
redirect_to @book
else
render :new
end
end
# This is the path to show a book
# its also where we redirect after creating the book
# GET /books/:id
def show
@book = Book.find(params[:id])
end
# ...
private
def book_params
# note thats its book singular - not plural
params.require(:book).permit(:title, :price, :subject_id, :description)
end
end