3

次のRubyonRailsコードスニペットで少し問題があります-私は本を持っていて、本の名前を更新したいのですが、これが私がそれをしようとする方法です:

<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 / editではなくlocalhost:3000 / books/5に移動します。

私はここで何が間違っているのですか?postメソッドではなく、どこかに更新するためのputメソッドがあるべきではありませんか?

4

4 に答える 4

4

更新は、post ではなく put を使用する必要があります。

<%= 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

form.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 に答える