向新的控制器操作提交带有参数的表单

Rails 6
bootstrap 4

在我的books_controller.rb中,我有:

def index
  @books = Book.select(:id,:name)
end

def new
    @book = Book.new
  end

def create
  @book = Book.new(book_params)
  respond_to do |format|
    if @book.save
      format.html { redirect_to @book,notice: 'Book was successfully created.' }
      format.json { render :show,status: :created,location: @book }
    else
      format.html { render :new }
      format.json { render json: @book.errors,status: :unprocessable_entity }
    end
  end
end

我有一张桌子,在我的views / books / index.htmlslim中,我有:

table.table.table-striped
  thead
    tr
      th Name
  tbody
    - @books.each do |book|
      tr
        td = book.name

我想做的是,在表格的末尾添加一个表格,允许用户添加书,而无需使用单独的表格,例如:

我尝试过:

= form_with url: new_book_path do |f|
  .form-inputs
    = f.label 'Add Book'
    = f.text_field :book_name
  .form-actions
    = f.submit    

我也尝试过:

= simple_form_for(@book) do |f|
  .form-inputs
    = f.input :book_name

但是当我单击“提交”时,什么也没有发生,并且收到以下消息:

actionController::RoutingError (No route matches [POST] "/bookd/new"):

我也尝试过:

= simple_form_for(@book || Book.new) do |f|
  .form-inputs
    = f.input :book_name

但是。我得到一个:

actionView::Template::Error (undefined method `book_name` for #<Book:0x000007f9cce...>);

另一个想法是将其链接,例如:

= link_to new_book_path,:class => "btn btn-primary btn-lg"

但是我如何传递book_name参数,以及应该执行哪个控制器操作?

这是我的路线:

books GET /books(.:format) books#index
POST /books(.:format) books#create
new_book GET /books/new(.:format) books#new
edit_book GET /books/:id/edit(.:format) books#edit
book GET /books/:id(.:format) books#show
PATCH /books/:id(.:format) books#update
PUT /books/:id(.:format) books#update
DELETE /books/:id(.:format) books#destroy
dianxinwad 回答:向新的控制器操作提交带有参数的表单

在Rails中,您不会通过发布到new路线来创建资源,而是发布到收集路线,例如。 /books。新操作仅用于创建带有表单的页面。

new_book_path返回/bookd/new的原因仍然很令人困惑,但错误实际上是正确的。 new_book_path响应GET-而不是POST。 Rails Routing from the Outside中对此进行了解释。

如果您实际上只是使用:

table.table.table-striped
  thead
    tr
      th Name
  tbody
    - @books.each do |book|
      tr
        td = book.name

= simple_form_for(@book || Book.new) do |f|
  .form-inputs
    = f.input :name # book_name is a typo?

它将正确创建带有action="/books" method="POST"的表单。

我不知道您要如何处理这种混乱:

= form_with url: new_book_path do |f|
  .form-inputs
    = f.label 'Add Book'
    = f.text_field :book_name
  .form-actions
    = f.submit    

    = simple_form_for(@book) do |f|
      .form-inputs
        = f.input :book_name

但是the HTML specifications都不允许嵌套<form>元素,结果可能是不可预测的。例如,提交按钮可以提交内部表单或外部表单。

本文链接:https://www.f2er.com/2663010.html

大家都在问