2017-05-14 17 views
0

私はRuby on Railsには新しく、オブジェクトを更新しようとするとこのエラーが発生します。 は、ここに私のコントローラです:Ruby on Rails - [POST] "/ setor/update"と一致するルートがありません

class SetorController < ApplicationController 
    def index 
    @setor = Setor.all 
    end 

    def new 

    end 

    def show 
     @setor = Setor.find(params[:id]) 
    end 


    def create 
    @setor = Setor.new(setor_params) 
    @setor.save 
    redirect_to @setor 
    end 

    def edit 
    @setor = Setor.find(params[:id]) 
    end 


    def update 
    @setor = Setor.find(params[:id]) 
    if (@setor.update(setor_params)) 
     redirect_to @post 
    else 
     render 'edit' 
    end 
    end 

    private def setor_params 
    params.require(:setor).permit(:nome, :sigla, :cnpj) 
    end 
end 

これはインデックスページである - 私は、オブジェクトを編集するためにリンクされています

<%= @setor.each do |s| %> 
    <%= s.nome %> | 
    <%= s.sigla %> | 
    <%= s.cnpj %> | 
    <%= link_to "edit", edit_setor_path(s.id) %> <br> 

<% end %> 

、これは更新フォームです:

<h1> Editar Setor </h1> 

<%= form_for :setor, url: setor_path(:update) do |f| %> 
<p> 
    <%= f.label :nome %> 
    <%= f.text_field :nome %> <br> 
    <%= f.label :sigla %> 
    <%= f.text_field :sigla %> <br> 
    <%= f.label :cnpj %> 
    <%= f.text_field :cnpj %> <br> 
</p> 

<%= f.submit %> 

<% end %> 

私は何行方不明?

ありがとうございます!このような何かをしようとしてについて

<%= form_for @setor do |f| %> 
+0

routes.rbファイルを投稿できますか? – joey

答えて

1

まず、あなたがルートを持たせますedit_setor_pathと一致します。端末でrails routesを実行するか、ブラウザのlocalhost:3000/rails/info/routesに移動してください。あなたのインデックスページ

は、次のものが:

<%= link_to "edit", edit_setor_path(s.id) %> <br> 

あなたはsのオブジェクトのIDを渡す必要はありません。 Railsはこれを単独で把握します。 @setorsへのごSetorControllerのindexアクションに変更@setor

<%= link_to "edit", edit_setor_path(s) %> <br> 

@setorsにごindex.html.erbファイル内@setorを変更します。その代わり、単にオブジェクトを渡します。

edit.html.erbの:セクタを@setorに変更してください。 edit.html.erbフォームからurl: setor_path(:update)を削除することもできます。

これらの変更は、Railsの規則に従います。特にRailsを学ぶときは、可能な限りRailsの規約に従ってください。

+0

答えをくれてありがとう、変更を加えて問題を解決したようです。私がフォームを送信すると、呼び出す必要のあるメソッドが作成または更新されていることを、レールはどのように知っていますか? – xSlok

+1

form_forは.new_recordを呼び出しますか?メソッドが渡されたオブジェクトに渡されます。 .new_recordなら? falseを返すと、Railsはレコードがデータベースに存在し、コントローラの編集アクションを実行していることを認識します。 .new_recordなら?Railsはオブジェクトがまだ存在しないことを知り、コントローラの新しいアクションを実行します。 – hashrocket

0

てみ

setors_controller.rbにあなたのコントローラの名前を変更し、SetorsControllerにクラス名を変更する - これは従うことです典型的なRails命名規則です。その後

あなたがルートを持っていることを確認してください。

# config/routes.rb 
Rails.application.routes.draw do 
    resources :setors 
end 

コントローラで設定したインスタンス変数を使用するようにビューのform_forタグを更新します。

# app/views/setors/edit.html.erb 
# NOTE: folder path above... "setor" is now "setors" to follow the Rails convention 
<%= form_for @setor do |f| %> 
    <p> 
    <%= f.label :nome %> 
    <%= f.text_field :nome %> <br> 
    <%= f.label :sigla %> 
    <%= f.text_field :sigla %> <br> 
    <%= f.label :cnpj %> 
    <%= f.text_field :cnpj %> <br> 
    </p> 

    <%= f.submit %> 

<% end %> 
0

方法:フォームコードで@setorオブジェクトに言及する

+0

form_forに '@setor'を置くと、私はこのエラーに遭遇します。フォームの最初の引数にnilを含めることも、空にすることもできません。この問題を解決しました。 "新しい"メソッドに '@setor = Sector.new 'を追加しました – xSlok

関連する問題