2012-01-03 11 views
29

Sto correndo in un errore di routing (credo) mentre utilizzo il form Rails for helper. Ho cercato in giro e guardato a this question, ma il plurale di "static_event" con pluralize è "static_events" quindi sono in perdita. Qualsiasi aiuto sarebbe apprezzato. Ecco i dettagli ....Metodo non definito con "_path" durante l'utilizzo di rotaie form_for

ActionView::Template::Error (undefined method `static_events_path' for #<#<Class:0x007f9fcc48a918>:0x007f9fcc46fa78>): 

il mio modello:

class StaticEvent < ActiveRecord::Base 
attr_accessible :content, :title, :discount, :location, :day_of_week, :start_time 

mio controller:

class StaticEventsController < ApplicationController 

    before_filter :authenticate, :only => [:create, :destroy] 
    before_filter :authorized_user, :only => [:destroy] 


    def new 
    @title = "Share An Event" 
    @static_event = StaticEvent.new 
    end 

    def create 
    @static_event = current_user.static_events.build(params[:event]) 
    if @static_event.save 
     flash[:success] = "Event Shared" 
     redirect_to @static_event #this was the old version 
    else 
     render :new 
    end 
    end 

Il percorso:

match '/static-events/new', :to => 'static_events#new' 
match '/static-events/',  :to => 'static_events#index' 
match '/static-events/:id', :to => 'static_events#show' 

La vista

<%= form_for (@static_event) do |f| %> 
<%= render 'shared/error_messages', :object => f.object %> 
<%= text_field "static_event", "title", "size" => 48 %> 
<%= time_select "static_event", "start_time", {:ampm => true, :minute_step => 15} %> 
<%= text_area "static_event", "content", "cols" => 42, "rows" => 5 %> 
<%= text_field "static_event", "discount", "size" => 48 %> 
<%= text_field "static_event", "location", "size" => 48 %> 
<%= text_field "static_event", "day_of_week", "size" => 48 %> 
<input name="" type="submit" class="button" value="share on chalkboard" /> 
<% end %> 

risposta

24

Solo percorsi creati utilizzando il metodo resources sono chiamati automaticamente.

Se si desidera assegnare un nome i percorsi, utilizzare l'opzione :as:

match '/static-events/new', :to => 'static_events#new', :as => :new_static_event 
match '/static-events/',  :to => 'static_events#index', :as => :static_events 
match '/static-events/:id', :to => 'static_events#show', :as => :static_event 

Tuttavia, è meglio utilizzare il metodo resources. È necessario passare il "vero" nome del modello come primo parametro, quindi ignorare il percorso se si desidera:

resources :static_events, :path => 'static-events' 
+0

Ottimo, l'ho aggiornato a questo. Grazie Fábio! – Alekx

+0

Nelle rotaie 4, dovrai specificare anche il metodo http con 'via' – courtsimas

+1

Come lato no, per i percorsi nidificati dovrai passare una coppia di valori così' form_for ([@ static_event, @ sub_event]) ' –

3

Run rake routes e vedrete la lista dei vostri percorsi. Quindi è possibile correggere il percorso del file per avere percorso percorso appropriato.

+0

Da quello che vedo, i miei percorsi sembrano accurati. – Alekx

+0

Un buon consiglio per il debug - questo mi ha aiutato. – infl3x

8

Prima di tutto, è necessario definire i percorsi in questo modo:

resources 'static-events', :only => [:new, :create] 

Questo creerà un percorso per il nuovo e creare metodi.

Perché quando si utilizza un nuovo oggetto ActiveRecord come argomento da formattare, cercherà * s_path come static_events_path nel file di rotte con il verbo POST.

Penso che il modo in cui hai definito i tuoi percorsi non crei il static_events_path con verbo POST (puoi verificarlo usando i percorsi di rake come diceva megas). Quindi non utilizzare più la corrispondenza, utilizzare le risorse o ottenere/post/... anziché la corrispondenza nei progetti Rails 3.

EDIT

Non ho notato ieri, ma non esiste un percorso per creare il metodo. Aggiungi il percorso di seguito prima di static_events # index o rimuovi tutti i percorsi e fai come ho detto sopra.

post '/static-events/', :to => 'static_events#create' 
+0

': static-events' non è un simbolo valido –

+0

Ho usato: static_events e ha funzionato. – Alekx

+0

Hai ragione, i simboli non possono contenere trattini. Ho corretto l'errore – basgys

1

Questo è accaduto a me quando stavo usando una risorsa nidificato, ma ha dimenticato di inizializzare in realtà il genitore risorsa usando load_and_authorize_resource in cancan. Pertanto, la risorsa padre era nullo e ha generato questo errore.

L'ho risolto dichiarando load_and_authorize_resource sul genitore nel controller.

Problemi correlati