Не могу вставить данные в БД в ruby ​​на рельсах - PullRequest
0 голосов
/ 19 октября 2018

Я только изучаю RoR и теперь путаюсь, как вставить данные в БД.Вот мой код:

book_insert.html.erb

<%= content_for :helloworld do %>
    <%= form_tag("/insert", method: "post") do %>
        <%= label_tag(:title, "Title") %>
        <%= text_field_tag(:title) %><br>
        <%= label_tag(:price, "Price") %>
        <%= number_field_tag(:price) %><br>
        <%= label_tag(:subject_id, "Subject ID") %>
        <%= number_field_tag(:subject_id) %><br>
        <%= label_tag(:description, "Description") %>
        <%= text_field_tag(:description) %><br>
        <br>
        <%= submit_tag("Submit") %> 
    <% end %>
<% end %>

book_controller.rb

class BookController < ApplicationController
    def insert
        @book = Book.new(book_params)
        @book.save
        render :book_page
    end

    def book_params
        params.require(:books).permit(:title, :price, :subject_id, :description)
    end

    def showinsert
        render :book_insert
    end
end

Возвращаетсяошибка:

Выполнено 400 неверных запросов за 4 мс (ActiveRecord: 0,0 мс) ActionController :: ParameterMissing (параметр отсутствует или значение пусто: книги):

ПожалуйстаПомогите.Спасибо

Ответы [ 3 ]

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

form_tag обычно используется для отправки немодельных действий на карту controller#action.Вам, вероятно, нужно использовать form_for и его соответствующих помощников внутри формы

<%= content_for :helloworld do %>
  <%= form_for Book.new, url: "/insert", method: "post" do |f| %>
    <%= f.label :title %>
    <%= f.text_field :title %><br>
    <%= f.label :price %>
    <%= f.number_field :price %><br>
    <%= f.label :subject_id %>
    <%= f.number_field :subject_id %><br>
    <%= f.label :description %>
    <%= f.text_field :description %><br>
    <br>
    <%= f.submit "Submit" %> 
  <% end %>
<% end %>

С указанным кодом код params будет передан внутрь :book => {} хеш, поэтому вам нужно изменить book_params на

def book_params
  params.require(:book).permit(:title, :price, :subject_id, :description)
end              #^ 
ниже
0 голосов
/ 19 октября 2018

Метод 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
0 голосов
/ 19 октября 2018

Вы должны сделать book в методе book_params вместо books:

def book_params
    params.require(:book).permit(:title, :price, :subject_id, :description)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...