3

下面的 ruby​​ on rails 代码片段有点麻烦 - 我有书,想更新书名,这是我尝试做的方法:

<h1>Edit the book "<%= @book.name %>"</h1>
<%= form_tag action: :update, id: @book do %>
    <p>
        <label for="book_name">Name</label>
        <%= text_field :book, :name %>
        <%= submit_tag 'Save changes' %>
    </p>
<% end %>

这就是我在书籍控制器中所做的:

def edit
    @book = Book.find(params[:id])
end

def update
    @book = Book.find(params[:id])
    if @book.update_attributes(params[:book])
        redirect_to :action => 'show', id => @book
    else
        @subjects = Subject.find(:all)
        render :action => 'edit'
    end
end

这些是我的路线:

root to: 'authors#index'
resources :books, :authors

当我单击表单中的提交按钮时,它给我No route matches [POST] "/books/5"并指向 localhost:3000/books/5 而不是停留和 localhost:3000/books/5/edit

我在这里做错了什么?不应该有一个 put 方法来更新某处的东西而不是 post 方法吗?

4

4 回答 4

4

更新应该使用 put 而不是 post。

<%= form_tag( { :controller => :books, :action => :update, :id => @book.id }, { :method => :put } ) do %>

或者更好的是使用 form_for

 <%= form_for @book do |f| %>

在您的控制台上运行“rake routes”,它将打印出所有可用的路线。

于 2012-10-17T21:32:25.280 回答
3

请试试这个:

我们需要在路由文件中指定匹配。

match "/books/:id" => "books#update"
于 2012-10-17T21:30:25.050 回答
2

resources :books应该做的工作。您不必明确使用“匹配”。

def edit
  @book = Book.find(params[:id])
end

表单.html

form_for @book, :method => :put do |f|

def update
@book = Book.find(params[:id])
@book.update_attributes(params[:book])
end

这应该可以完成这项工作。

于 2012-10-17T21:47:57.880 回答
0

我以前有这个问题。一切都是正确的,但仍然出现错误,然后我发现它是

gem 'rails-api'

删除它,一切正常。

于 2015-05-26T01:46:09.560 回答