Rails 4を学習しているときに小さな演習を行っていますが、オブジェクトを更新しようとするとルーティングエラーが発生します。エラーメッセージが表示され続けます:ルートが一致しません[ POST] "/ movies/1/edit"しかし、私のコードが正しくない場所がわかりません:
私のmovies_controller.rb
class MoviesController < ApplicationController
def index
@movies = Movie.all
end
def show
@movie = Movie.find(params[:id])
end
def new
@movie = Movie.new
end
def create
@movie = Movie.create(movie_params)
if @movie.save
redirect_to "/movies/#{@movie.id}", :notice => "Your movie was saved!"
else
render "new"
end
end
def edit
@movie = Movie.find(params[:id])
end
def update
@movie = Movie.find(params[:id])
if @movie.update_attributes(params[:movie])
redirect_to "/movies"
else
render "edit"
end
end
def destroy
end
private
def movie_params
params.require(:movie).permit(:name, :genre, :year)
end
end
これが私のedit.html.erbです
<h1>Now Editing:</h1>
<h3><%= @movie.name %></h3>
<%= form_for @movie.name do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<br>
<%= f.label :genre %>
<%= f.text_field :genre %>
<br>
<%= f.label :year %>
<%= f.number_field :year %>
<br>
<%= f.submit "Update" %>
およびroutes.rbファイル:
MovieApp::Application.routes.draw do
get "movies" => "movies#index"
post "movies" => "movies#create"
get "movies/new" => "movies#new"
get "movies/:id" => "movies#show"
get "movies/:id/edit" => "movies#edit"
put "movies/:id" => "movies#update"
end
最後に、rake routes
の実行からの出力は次のとおりです。
Prefix Verb URI Pattern Controller#Action
movies GET /movies(.:format) movies#index
POST /movies(.:format) movies#create
movies_new GET /movies/new(.:format) movies#new
GET /movies/:id(.:format) movies#show
GET /movies/:id/edit(.:format) movies#edit
PUT /movies/:id(.:format) movies#update
form_for @movie.name
はform_for @movie
である必要があります。何が起こっているのかわかりませんが、これがどういうわけかあなたに<form action="">
を与えているのではないかと思います。
エラーメッセージは、編集URLにPOSTリクエストを送信していることを示しています。
[POST]「/ movies/1/edit」に一致するルートがありません
一方、ルートではgetリクエストを指定しました。
get "movies /:id/edit" => "movies#edit"
それがどういうわけか問題を引き起こしていると思うので、投稿するリクエストを変更することができます。
post "movies/:id/edit" => "movies#edit"
使用している場合はインデックスファイル内
button_to 'Edit', edit_movie_path(movie)
に変更します
link_to 'Edit', edit_movie_path(movie)
ボタンはそれをPOST
として送信しますが、リンクはそれをGET
として送信するためです。