2012-09-20 10 views
11

Voglio creare un modello di rotaie:Override Rails controller di instradamento con lettere maiuscole nel nome del modello

rails generate model ABCThing 

Quindi questo sarà creare una tabella, abc_things. Grande. Il problema arriva con il controller e il routing. Voglio che il mio controller da:

class ABCThingsController < ApplicationController 
end 

Tuttavia, dopo l'aggiunta nel routes.rb

resources :abc_things, :only => [:index] 

e creando il corrispondente index vista, ottengo il seguente errore nel browser:

Expected /app/controllers/abc_things_controller.rb to define AbcThingsController 

Il problema è facile da vedere ("ABCThings".tableize.classify => "AbcThing"), ma non sono sicuro di come risolverlo. Voglio sovrascrivere il routing predefinito dei binari dalla vista al controller, ma non sono sicuro di come.

apprezzerebbe alcun aiuto (e suggerimenti per una migliore titolo della domanda!)

+1

posso chiedere perché sulla terra si vuoi farlo? Le convenzioni sono uno dei punti di forza del RoR, perché li ha rotti? I nomi dei modelli BTW non dovrebbero essere plurali. – cthulhu

+0

Il plurale nella generazione del modello era un errore di battitura, ma sicuramente puoi apprezzare che ci sono innumerevoli sigle di tre lettere per cui capitalizzare solo la prima lettera dell'acronimo non ha molto senso grammaticale – rwb

+3

@cthulhu per lo stesso motivo per cui Rails supporta inflessioni. Dovrebbero essere * convenzioni *, non leggi. – mahemoff

risposta

12

ho avuto questo problema e dopo aver provato tutte le soluzioni di cui sopra; è stato in grado di risolvere il mio problema usando l'inflector.

Nel mio caso il problema era che TLA::ThingsController stava risolvendo come TlaThingsController

mettendo la seguente nei miei inizializzatori piegatore fisso è

config/initializers/inflections.rb

ActiveSupport::Inflector.inflections do |inflect| 
    inflect.acronym 'TLA' 
end 
+1

Questo è il modo Rails e dovrebbe essere svitato. Grazie – rwb

-1

Quando si esegue il comando

rails generate model ABCThings 

Si genererà modello e non un controller. Se si desidera che sia il modello e il controller uso seguente

rails generate scaffold ABCThings 

Credo che non si genera controllore utilizzando rotaie comando e quindi problema è stato verificato per generare l'uso del controller seguente comando

rails generate controller ABCThings 

e si può /app/controllers/abc_things_controller.rb come segue

class AbcThingsController < ApplicationController 
end 
+0

Eh? Ho creato il mio controller manualmente. Voglio avere 'class ABCThingsController rwb

2

È necessario impostare il nome del controller personalizzato, nel percorso s.rb:

resources :abc_things, :only => [:index], :controller => "ABCThings" 
+0

Stesso messaggio di errore. Penso che tu voglia dire ': controller =>" ABCThings "' – rwb

+0

oh, mi spiace, solo il nome senza parte "Controller", modifica ora – byterussian

+2

Questo genererà ora un avviso, come per le [Guide delle rotaie] (http://guides.rubyonrails.org/routing.html#specifying-a-controller-to-use): "È supportata solo la notazione della directory Specifica del controller con notazione costante ruby ​​(ad esempio': controller => 'Admin :: UserPermissions '') può portare a problemi di routing e genera un avviso." –

2

Questo potrebbe essere cambiato con Ruby a un certo punto, ma per la denominazione classi con più tappi di fila (acronimi o sigle), non è più necessario includere il carattere di sottolineatura nel nome del file.

# abc_thing.rb 

potrebbero contenere

class ABCThing 

    def hello 
    puts "Hello World" 
    end 

end 

o

class AbcThing 

    def hello 
    puts "Hello World" 
    end 

end 
Problemi correlati