Mi página de inicio (o página de bienvenida) consistirá en datos de dos modelos (llamémoslos autores y publicaciones). Soy nuevo en los rieles y no estoy seguro de cuál es la mejor manera de lograrlo.
¿Debo crear un nuevo controlador llamado welcome que recopile datos de los autores y publicaciones y luego los muestre en la vista del índice de bienvenida? ¿O debería tener una vista de bienvenida bajo el modelo de publicación que también obtiene datos de los autores? ¿O alguna otra forma de lograr esto?
Entiendo cómo hacer todo esto técnicamente, pero no estoy seguro de cuál es el método de mejores prácticas utilizando el marco de rieles.
fuente
@posts = Posts.find( ...
o@posts = Posts.all
algo similar en este nuevo controlador / acción no se consideraría una violación de los principios de DRY, aunque tal código ya puede aparecer en la acciónPost
del controladorindex
. ¿Existe una forma mejor (más modular), que utiliza el código ya escrito de la acciónPost
del controladorindex
?No parece haber una sola mejor práctica.
(1) El
config/routes.rb
archivo estándar parece sugerir que la página raíz (o la página de inicio / bienvenida) debe ser manejada porwelcome#index
. Si tuviera que guiarse por eso, entonces para generar elwelcome#index
controlador / acción correspondiente , puede usar el siguiente comando:Luego, en
config/routes.rb
, puede eliminar la ruta GET (get "welcome/index"
) agregada automáticamente por el generador y colocar la ruta raízroot 'welcome#index'
(oroot :to => 'welcome#index'
en Rails< 4
) en la parte superior del archivo, porque probablemente será su ruta más popular y debería coincidir primero.También recuerde eliminar
public/index.html
en Rails< 4
.(2) La guía de enrutamiento oficial de Ruby on Rails utiliza
PagesController
. En realidad sugierepages#main
, aunque para mí tiene más sentido seguirpages#home
(porque "página de inicio" es el término / concepto omnipresente). Además, este controlador puede manejar otras orientado a la página acciones tales comopages#about
,pages#contact
,pages#terms
,pages#privacy
, etc.(3) El Tutorial de Ruby on Rails , va con
static_pages#home
ystatic_pages#help
, etc., aunque no me gusta la idea de denotar este controlador con "estático". Es probable que estas páginas aún tengan algunos aspectos dinámicos, ¡particularmente la página de inicio!(4) Aunque no analiza cómo manejar una página de inicio , RailsCast # 117 en páginas semiestáticas sugiere otro conjunto de enfoques para mostrar solo recursos.
Siento preferencia por 1 y / o 2. Con el escenario "y", podría usar # índice de bienvenida y páginas # acerca, etc., mientras que con el escenario "o", podría usar páginas # inicio, páginas # acerca, etc. Si me obligara a elegir, optaría por la opción 2 solo porque terminas con menos código. Y por cierto, 2 y 3 son prácticamente iguales, aparte de la palabra "estática".
fuente
Me pregunté algo como esto cuando comencé Rails. Esto es lo que necesita saber:
Es decir, una combinación particular de controlador / vista puede funcionar con tantos modelos como necesite para generar esa página en particular.
El propósito del controlador es preparar el conjunto de datos que necesita mostrar, independientemente de los modelos que se utilicen para almacenar esos datos.
El propósito de la vista es luego mostrar esos datos de la manera más apropiada.
En otras palabras, las combinaciones de controlador / vista nunca están "debajo" de un modelo en particular. Usan modelos, pero no están bajo ellos en ninguna relación jerárquica. De hecho, son iguales a cualquier modelo que utilicen.
Creo que la confusión proviene del ejemplo del generador de andamios que se encuentra en AWDR y otros textos introductorios, como:
script ruby / generar controlador de modelo de andamio
Sé que esta relación implícita entre modelo y controlador / vistas me confundió un poco. Pero en realidad no existe una relación estricta. Si lo hubiera, sería muy difícil hacer algo complicado con el enfoque MVC. Y claramente, ese no es el caso.
Espero que esto ayude.
-- Juan
fuente
La mejor práctica sería su primera sugerencia. Cree un controlador de 'bienvenida' y llame a los registros de los modelos que desee. Tener un punto de ruta raíz a ese controlador. Muy limpio y adecuado.
fuente
Tenga en cuenta que en Rails3, la forma correcta de manejar esto es agregar la siguiente línea al final del archivo route.rb:
root :to => "welcome#index"
y elimine public / index.html.erb.
Tenga en cuenta también que el índice # de bienvenida corresponde a la acción de índice en un controlador de bienvenida y el código de la respuesta de The Wicked Flea se vería así:
class WelcomeController < ApplicationController def index @posts = Posts.find(:all, :limit => 10, :order => 'date_posted', :include => :user) end end
fuente
Esta respuesta es de Rails 3.2.1.
Primero configure un controlador para las páginas, llamado por ejemplo
static
:En archivo
app/controllers/static_controller.rb
:class StaticController < ApplicationController def index end end
Crea el nuevo archivo de vista
app/views/index.html.erb
Y finalmente configura tu
config/routes.rb
:MyApp::Application.routes.draw do match 'home', :to => "static#index" root :to => "static#index" end
Esto hará que ambos
/home
e/
irán a lo que haya puesto en el archivo de vista que acaba de crear.fuente
match 'home' => 'static#index'
Cree un nuevo controlador con el nombre más apropiado que pueda. SummaryController? StartController? DailyFrontPageController? Tendrás una idea.
No solo eso, consideraría seriamente la creación de un nuevo modelo, no basado en ActiveRecord, que recopile la información de sus modelos de autor y publicación (o cualquiera que sea su nombre real) para presentarla en su vista. La alternativa es ensamblar los datos en el controlador, lo que seguramente será complicado; lo fue cada vez que lo probé, y lo intenté mucho. Un modelo separado parece terminar mucho más ordenado.
Si el procesamiento es relativamente sencillo, ¿por qué no intentar construir los datos en el controlador primero, luego envolver la salida en un Struct, luego reemplazar el Struct con una clase real y mover la construcción allí, refactorizando todo el camino? No debería agregar demasiado al tiempo total (la mayor parte del código se puede reutilizar) y obtendrá una buena idea de lo que funciona mejor para usted.
fuente