2013-10-21 13 views
6

Tôi đang làm việc thông qua một bài tập nhỏ trong khi học Rails 4, nhưng chạy vào một lỗi định tuyến trong khi cố gắng cập nhật một đối tượng. Tôi tiếp tục nhận được một thông báo lỗi: Không trận tuyến đường [POST] "/ phim/1/chỉnh sửa" nhưng có thể không nhìn thấy nơi mã của tôi là không đúng:Rails 4 RoutingError: No Route Matches [POST]

movies_controller.rb tôi

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 

Dưới đây là edit.html.erb tôi

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

và tập tin 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 

cuối cùng, đây là đầu ra từ chạy 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 

Trả lời

3

form_for @movie.name nên form_for @movie. Tôi không thể biết chuyện gì đang xảy ra, nhưng tôi nghi ngờ điều này bằng cách nào đó cho bạn một số <form action="">.

+0

đó sẽ là tôi đoán là tốt, và hành động trống sẽ gửi trở lại current_url đó là con đường chỉnh sửa – Doon

+0

Cảm ơn @meager, nhưng bây giờ tôi nhận một '' NoMethodError trong phim # chỉnh sửa: không xác định phương pháp 'movie_path 'cho # <# : 0x007ff4c99f6300>' '? – TomK

+0

Bạn chưa đặt tên cho tuyến đường của mình. Bạn cần sử dụng hoặc sử dụng 'get 'movies" => "movies # index", như: "movies" ', hoặc, điều đúng, chỉ cần ném ra tất cả các route của bạn và chỉ sử dụng' resources: movies'. – meagar

2

Thông báo lỗi của bạn cho biết rằng bạn đang gửi yêu cầu đăng bài đến url chỉnh sửa.

No route matches [POST] "/movies/1/edit"

Trong khi ở tuyến đường bạn đã chỉ định yêu cầu nhận.

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

Tôi tin rằng bằng cách nào đó gây ra sự cố và bạn có thể thay đổi yêu cầu đăng.

post "movies/:id/edit" => "movies#edit" 
+1

đó không phải là vấn đề thực sự. bạn đang * cho là * để 'GET' Biểu mẫu chỉnh sửa, và POST/PUT nó trở lại tài nguyên để thực hiện các thay đổi. Thay đổi chỉnh sửa đối với POST sẽ phá vỡ điều đó. và không phải là điều đúng để làm. – Doon

+2

Tuyến đường của anh ấy tốt, anh ấy chắc chắn nên * không * sửa đổi tuyến đường của mình để chấp nhận phương pháp sai. Đây chỉ là để cho anh ta một lỗi, và tuyến đường của mình chắc chắn sẽ không bao giờ đạt được 'phim # cập nhật', nơi nó cần phải đạt được. – meagar

Các vấn đề liên quan