2012-10-17 6 views
2

다음 루비 레일 코드 스 니펫에 약간의 문제가 있습니다 - 책이 있고 책 이름을 업데이트하고 싶습니다. 여기에 어떻게하려고합니까 :업데이트 방법 "경로가 [POST]와 일치하지 않습니다."

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

나는하십시오이 내 루트입니다

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 

:

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

이 내가 책 컨트롤러에서 할 것입니다 양식에 단추를 제출하면 No route matches [POST] "/books/5"이 표시되고 localhost : 3000/books/5 대신에 localhost : 3000/books/5/edit

여기서 내가 뭘 잘못하고 있니? 게시물 메서드가 아닌 어딘가에서 물건을 업데이트하기위한 put 메서드가 있어야하지 않습니까?

답변

3

업데이트는 게시하지 말아야합니다.

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

또는 더 나은 아직는 콘솔 실행 "레이크 노선"에

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

form_for 사용하고 가능한 모든 경로를 출력합니다.

2

이 시도하십시오

우리는 루트 파일에서 일치를 지정해야합니다.

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

쿨, 고마워, 그랬어! 나는 자원이 충분하다고 생각했지만, 책은 충분하지 않았을까? – weltschmerz

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 

이 작업을 수행해야합니다.

0

이전에이 문제가있었습니다. 모든 것이 옳았지만 여전히 오류가 발생했다는 것을 알았습니다.

gem 'rails-api' 

제거하고 모두 정상적으로 작동했습니다.

관련 문제