更新方法“无路由匹配[POST]”

时间:2012-10-17 21:26:38

标签: ruby-on-rails ruby post put

在rails代码片段中遇到以下ruby的一点麻烦 - 我有书籍并希望更新一本书的名称,以下是我尝试这样做的方法:

<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 个答案:

答案 0 :(得分:4)

更新应使用put not post。

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

或者更好的是使用form_for

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

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

答案 1 :(得分:2)

请试试这个:

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

match "/books/:id" => "books#update"

答案 2 :(得分:2)

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

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

form.html

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

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

这应该可以胜任。

答案 3 :(得分:0)

之前我遇到过这个问题。一切都是正确但仍然得到错误然后我发现它是

gem 'rails-api'

删除它,一切正常。