2016-10-13 9 views
0

Städte # neue Controller zeigt Fehler beteiligt cities_path, aber ich es nicht in irgendeiner Datei noch in CitiesController. Ich habe alle Dateien überprüft, versucht, den Server neu zu starten, aber immer noch nichts.NoMethodError für neue Controller in Rails

undefined method `cities_path' for #<#<Class:0x007f9e4c1cb348>:0x00000003836140> 
Did you mean? city_path 

CitiesController

class CitiesController < ApplicationController 

    def index 
     @cities = City.all 
    end 

    def show 
     find_city 
    end 

    def new 
     @city = City.new 
    end 

    def edit 
     find_city 
    end 

    def update 
     find_city 

     if @city.save 
      redirect_to city_path(@city) 
     else 
      render "edit" 
     end 
    end 

    def create 
     @city = City.new(city_params) 

     if @city.save 
      redirect_to index_path 
     else 
      render "new" 
     end 
    end 

    private 

    def find_city 
     @city = City.find(params[:id]) 
    end 

    def city_params 
     params.require(:city).permit(:name, :icon_url) 
    end 

end 

Routes

get "/cities/new" => "cities#new", as: "new_city" 
    post "/index" => "cities#create" 
    get "/cities/:id" => "cities#show", as: "city" 
    get "/cities/:id/edit" => "cities#edit", as: "edit_city" 
    patch "/city/:id" => "cities#update" 

Formular (Fehler wird auf der ersten Zeile angehoben)

<%= form_for @city do |f| %> 

    <% if @city.errors.any? %> 
     <div class="errors"> 
      <ul> 
       <% city.errors.full_messages.each do |msg| %> 
        <li><%= msg %></li> 
       <% end %> 
      </ul> 
     </div> 
    <% end %> 

    <%= f.label "Name:" %> 
    <%= f.text_field :name, class: "form-control" %> 

    <%= f.label "Icon:" %> 
    <%= f.text_field :icon_url, class: "form-control" %> 

    <%= f.submit "Pošalji" %> 

<% end %> 
+0

Ich bin sehr unklar, warum Ihre Create Route nur '/ index' ist, während alles andere auf'/cities' beschränkt ist. Ihre Städte-Indexroute sollte wirklich "/ cities" sein, nicht "/ index". – meagar

+0

Es ist Index, weil nach der Erstellung der Stadt Indexseite angezeigt wird. Alle Städte werden auf der Indexseite der Site angezeigt, sie haben keine separate Ansicht. – Nikola

Antwort

1

Wenn Sie form_for @city verwenden, und @city ist ein neuer Datensatz, wird form_for versuchen, einen cities_path zu finden, um die neuen Attribute zurück zu senden.

Sie sollten in Ihrer Routes-Datei resources :cities verwenden, um die Routen und ihre Namen automatisch zu definieren. Wenn Sie eine begrenzte Anzahl von Routen definieren möchten, können Sie :only oder :except verwenden:

resources :cities, only: %i(new create show edit update) 

Wenn Sie nicht resources nicht verwenden, müssen Sie entweder explizit einen Pfad für Ihre form_for Anruf angeben, oder Sie müssen eine Route cities_path manuell benannt zur Verfügung zu stellen:

post "/index" => "cities#create", as: :cities 

Beachten Sie, dass Index-Routen nicht enthalten in der Regel tatsächlich das Wort index, Sie sollten wirklich nur sein Posting zu /cities, nicht /index.

post "/cities" => "cities#create", as: :cities 
Verwandte Themen