Layout nidificata per le risorse nidificati in Rails
-
18-09-2019 - |
Domanda
E 'possibile assegnare automaticamente un modello di layout specifico per un particolare controller e tutte le risorse nidificate al suo interno, come specificato nel routes.rb? Questa disposizione dovrebbe applicare solo le opinioni controllore specificati e quelli annidato all'interno di esso; esso non ha bisogno di essere applicato ad ogni vista all'interno dell'applicazione, come farebbe application.html.erb (In realtà sto usando il layout specializzato con il layout dell'applicazione per un layout nidificato).
Quindi, per esempio, se avessi
map.resources :news, :shallow => true do |n|
n.resources :articles do |a|
a.resources :comments
end
end
quando visito un URL come localhost/news/1/articles/new
dovrei vedere il mio layout news.html.erb
in azione. A partire da ora, non lo faccio.
Io, ovviamente, non voglio ricreare lo stesso file di layout per ciascun controller nidificato all'interno del genitore (anche se avrei tirare fuori la carne il layout e metterlo in un parziale in comune). Sono ancora meno entusiasta di specificare il modello di layout negli specifici controllori stessi (questo esempio specifico è una specie di una cosa temporanea, anche se avrò un caso d'uso 'reale' per questo un po 'più in basso la strada).
Grazie!
Soluzione
Modifica la domanda iniziale per chiarezza (le risposte non sono state del tutto rispondendo il problema centrale), mi sono reso conto che cosa devo fare è di avere le classi controller nidificati ereditano dal genitore di livello superiore. Non solo questo make risolvere la questione centrale più facile, fissa alcune altre cose che mi sono state fastidioso.
(direi "a'doy", ma ce ne sono altri che lavorano su questa applicazione, che oscurava quello che normalmente sarebbe un po 'più evidente.)
Altri suggerimenti
Per il vostro problema news.html.erb, è che un errore di battitura? Si dovrebbe vedere il file new.html.erb che è nella cartella views / articoli (supponendo layout predefinito) e non un file news.html.erb. Dovrete fare in modo sia impostato la variabile @news istanza e la tua form_for sarà per [@news, @article] invece di appena @article.
Inoltre, non c'è bisogno di creare un layout per ogni controller, è possibile crearne uno application.html.erb nella cartella layout e tutti i controllori che non hanno un layout nella cartella layout utilizzerà application.html .erb e non c'è bisogno di specificarlo nel vostro controller, basta rimuovere il layout con lo stesso nome del controller.
" Sono ancora meno entusiasti su come specificare il modello di layout nei controllori stessi "
Non c'è motivo di preoccuparsi di questo. Questo è semplicemente ciò che si fa. E 'una linea di codice DSL, creato appositamente per questo scopo. Non goffo.
class ArticlesController < ActionController::Base
layout :news
end