2012-01-20 7 views
10

Ho un modello chiamato ImplicitTest. Si dice che avere un oggetto Ruby chiamato Test rompa un sacco di cose in Rails.Come scrivere il routing quando il nome del modello di risorsa non corrisponde a percorso o controller

Tuttavia, desidero ancora esporlo come risorsa RESTful come test (ad esempio /tests, /test/1/edit e così via). Inoltre, sarebbe bello mantenere il controller come TestsController, anche se è meno importante.

stavo facendo questo avendo semplice linea resources :tests nel mio file routes.rb, ma questo non riesce per le forme RESTful (ad esempio <%= form_for @test ... > - questo raccoglie che l'oggetto @test è di tipo ImplciitTest, e cerca di occhiata implicit_test_path che non esiste.

ho provato ad aggiungere form_for opzioni, ma sono giunto alla conclusione che per avere il lavoro sotto forma sia per i new e edit azioni, non c'era un unico modo unificato di chiedere form_for() per utilizzare un prefisso diverso per la ricerca del nome del percorso

Quindi ho cercato di affrontare il problema dal routing lato. C'è una linea che posso aggiungere al file percorsi che mi permetterà di:

  1. Avere un modello chiamato ImplicitTest
  2. Avere il percorso come/test
  3. Utilizzare il <% = form_for @test .. .%> tag ancora
  4. Tenere il controller come TestsController (opzionale)

so di partenza l'Sentiero dorato per fare questo, ma Rails non è lasciare me utilizzare il test come un nome del modello, ma questo è il nome che gli utenti si attendono vedi nell'URL per questa risorsa, quindi spero ci siano semplici opzioni di routing che abilitino questo.

risposta

8

Tutto quello che dovete fare è impostare l'opzione :path lungo il percorso:

resources :implicit_tests, :path => '/test' 

Si potrebbe ancora utilizzare lo standard implicit_tests_path helper in questo modo, anche, in modo il codice non deve divergere di alterare il Schema URL

+2

Questo non sembra aggiustare il nome del contoller, ma regolandolo su 'resources: implicit_tests,: controller =>" tests ",: path =>" tests "' sembrava aggiungerlo. – Phantomwhale

1

mentre guardando risposta di coreyward, ci siamo imbattuti in un metodo più breve, ma meno intuitivo di ottenere quello che mi serve:

resources :tests, :as => "implicit_tests"

Sono questi essenzialmente facendo la stessa cosa (dato il :controller interruttore in più ho aggiunto nei commenti)? O è uno preferito?

+0

Si può certamente fare anche questo, ma i riferimenti misti al tuo controller Implicit Tests e il modello con nomi che non si adattano veramente alla "Rails Way" iniziano a diventare confusi. – coreyward

+1

Ah ok, pensavo tanto. Felice di provare a stare il più vicino possibile al binario, quindi vado con la tua risposta. Potrebbe anche tornare ad avere un ImplicitTestController, per mantenere basso il numero di opzioni di routing, e per mantenere il nome del controllore più vicino al nome del modello, che è probabilmente meglio che tenerlo più vicino al nome del percorso; essenzialmente ciò che suggerisci sopra. – Phantomwhale