2017-05-14 5 views
0

Ich bin neu auf Schienen Rubin und ich halte diesen Fehler, wenn ein Objekt zu aktualisieren versuchen. hier ist mein Controller:Ruby on Rails - Keine Route treffer [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 

dies der Index-Seite ist - wo ich das Objekt bearbeiten verlinken auf:

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

<% end %> 

und das ist das Update-Formular:

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

was bin ich fehlt?

Danke!

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

Können Sie Ihre routes.rb-Datei posten? – joey

Antwort

1

Erstens, stellen Sie sicher, dass Sie eine Route haben das entspricht edit_setor_path. Sie können dies tun, indem Sie rails routes in Ihrem Terminal oder indem Sie auf die URL localhost:3000/rails/info/routes in Ihrem Browser gehen.

Auf dem Index-Seite haben Sie die folgenden Schritte aus:

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

Sie brauchen nicht in die ID des s-Objekt übergeben. Rails wird das selbst herausfinden. Stattdessen passiert nur in dem Objekt:

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

ändern @setor im Index Aktion Ihrer SetorController zu @setors und @setor in Ihrer index.html.erb Datei zu @setors ändern.

Ändern Sie den: Sektor in Ihrem edit.html.erb @setor. Sie können auch url: setor_path(:update) aus dem Formular edit.html.erb entfernen.

Diese Änderungen folgen Rails Konventionen. Sie sollten versuchen, den Rails-Konventionen so weit wie möglich zu folgen, besonders wenn Sie nur Rails lernen.

+0

hinzugefügt wurde Danke für die Antwort, die Änderungen schien das Problem zu lösen. Wie wissen die Rails, dass beim Erstellen eines Formulars die Methode zum Anrufen erstellt oder aktualisiert wird? – xSlok

+1

form_for ruft den .new_record auf? Methode für das übergebene Objekt. Wenn .new_record? gibt false zurück, Rails weiß, dass der Datensatz in der Datenbank vorhanden ist, und führt die Editieraktion des Controllers aus. Wenn .new_record?gibt true zurück, Rails weiß, dass das Objekt noch nicht existiert und führt die neue Aktion des Controllers aus. – hashrocket

0

Try @setor Objekt in Form Code zu erwähnen

Benennen Sie Ihre Controller setors_controller.rb und ändern Sie den Klassennamen SetorsController - dies folgen die typische Rails-Namenskonvention.

Dann stellen Sie sicher, Sie haben eine Route:

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

aktualisieren form_for -Tags Ihrer Sicht die Instanz-Variable in der Steuerung einrichten zu verwenden:

# 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

Wie wäre es versucht, etwas wie folgt aus::

+0

wenn ich '@ setor' auf das Formular_fürfore, bekomme ich diesen Fehler: Das erste Argument im Formular kann nicht nil enthalten oder leer sein. Dieses Problem wurde behoben, indem '@setor = Sector.new auf der" neuen "Methode – xSlok

Verwandte Themen