web-dev-qa-db-ja.com

Rails 4 RoutingError:ルートが一致しません[POST]

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
8
TomK

form_for @movie.nameform_for @movieである必要があります。何が起こっているのかわかりませんが、これがどういうわけかあなたに<form action="">を与えているのではないかと思います。

3
meagar

エラーメッセージは、編集URLにPOSTリクエストを送信していることを示しています。

[POST]「/ movies/1/edit」に一致するルートがありません

一方、ルートではgetリクエストを指定しました。

get "movies /:id/edit" => "movies#edit"

それがどういうわけか問題を引き起こしていると思うので、投稿するリクエストを変更することができます。

post "movies/:id/edit"    => "movies#edit"
3
Zero Fiber

使用している場合はインデックスファイル内

button_to 'Edit', edit_movie_path(movie)

に変更します

link_to 'Edit', edit_movie_path(movie)

ボタンはそれをPOSTとして送信しますが、リンクはそれをGETとして送信するためです。

1