在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方法吗?
答案 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'
删除它,一切正常。