La primera cosa que necesitaremos para crear un nuevo post, es crear un espacio para hacer eso
en nuestra aplicación. Un buen lugar podría ser /posts/new
. Si tratas de navegar a esa
dirección ahora -- visitando http://localhost:3000/posts/new -- Rails te dará un error de
ruteo:
Esto es porque no en ningún lugar dentro de las rutas para la aplicación -- definidas dentro
de config/routes.rb
-- que defina esta ruta. Por defecto, Rails no tiene rutas configuradas,
excepto por la ruta root
que definimos anteriormente, es por esto que tú tendrás que definir
tus rutas cuando las necesites.
Para hacer esto, vas a necesitar crear una ruta dentro de el archivo config/routes.rb
, en
una nueva línea entre el do
y el end
del método draw
:
get "posts/new"
Esta ruta es super simple: define una nueva ruta que sólo responderá a peticiones GET
, y qye
la ruta se encuentra en posts/new
. Pero cómo sabe a donde ir sin haber usado la opción
:to
? Bueno, Rails usa una convención sensible aquí: Rails asumirá que lo que tú quieres
es que esta ruta vaya a la acción new
dentro de el controlador posts
.
Con esta ruta definida, tus peticiones ahora se pueden hacer a través de /posts/new
en
la aplicación. Navega hacia: http://localhost:3000/posts/new. Verás otro error de ruteo:
Este error está pasando porque esta ruta necesita un controlador que esté definido. La ruta
está tratando de encontrar el controlador para servir la petición, pero con el controlador
no definido, simplemente no lo puede hacer. La solución para este caso en particular es simple:
crea un controlador llamado PostsController
. Puedes hacerlo ejecutando el siguiente comando:
$ rails g controller posts
Si abres el nuevo archivo generado app/controllers/posts_controller.rb
,
verás un controlador vacío:
class PostsController < ApplicationController
end
Un controlador es simplemente una clase que es definida para heredar de ApplicationController
.
Dentro de ésta, vas a definir los métodos que se convertirán en acciones para este controlador.
Estas acciones van a ejecutar operaciones CRUD sobre los posts dentro de nuestro sistema.
Si refrescas la dirección http://localhost:3000/posts/new ahora, vas a tener un nuevo error:
Este error indica que Rails no puede encontrar la acción new
dentro de
PostsController
que recién has generado. Esto es porque cuando los controladores
son generados en Rails están vacíos por defecto, a menos que le digas que acciones
quieres durante el proceso de generación.
Para definir manualmente una acción dentro de un controlador, todo lo que necesitas
es definir un nuevo método dentro del controlador. Abre app/controllers/posts_controller.rb
y dentro de la clase PostsController
, define el método new
así:
def new
end
Con el método new
definido en PostsController
, si tú refrescas
http://localhost:3000/posts/new verás otro error:
Estás obteniendo este error ahora porque Rails espera que las acciones planas como ésta tengan vistas asociadas a ellas para mostrar la información. Con ninguna vista disponible, Rails mostrará un error.
En la imagen de arriba, la línea de abajo fue eliminada. Vamos a ver como se ve el error completo:
Missing template posts/new, application/new with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in: * "/path/to/blog/app/views"
Eso es casi un montón de texto! Revisemos rápidamente para entender cuál es la función de cada parte.
La primera parte identifica que plantilla está faltando. En este caso, es la plantila posts/new
.
Rails primero buscará esta plantilla, si no la encuentra, luego tratará de cargar la plantilla
llamada application/new
. Busca una aquí porque el PostsController
hereda de ApplicationController
.
La siguiente parte del mensaje contiene un map (hash
en inglés). La clave :locale
en este map
simplemente indica el lenguaje que debe contener la plantilla solicitada. Por defecto, está configurado
en Inglés -- o "en" --. La siguiente clave, :formats
especifica el formato de la plantilla que será
servido en la respuesta. El formato por defecto es :html
, es por eso que Rails busca una plantilla
HTML. La clave final, :handlers
, nos dice que manejador de plantilla (o template handler en inglés)
puede ser usada para producir nuestra plantilla. :erb
es el manejador más usado para plantillas HTML,
:builder
es usado para plantillas XML, y :coffee
usa CoffeeScript para construir plantillas JavaScript.
La más simple plantilla que funcionaría en nuestro caso sería una localizada en app/views/posts/new.html.erb
.
La extensión de este nombre de archivo es importante: la primera extensión define el formato de la plantilla,
y la segunda extensión el manejador de plantilla que será usado. Rails está tratando de encontrar una
plantilla llamada posts/new
en app/views
para la aplicación. El formato para esta plantilla puede sólo
ser html
y el manejador debería ser erb
, builder
o coffee
. Ya que tú quieres crear un nuevo
formulario HTML, tendrás que usar el lenguaje ERB
. Por lo tanto el archivo debería ser llamado
posts/new.html.erb
y necesita ser localizado dentro de la carpeta app/views
de la aplicación.
Ahora ve y crea un nuevo archivo en app/views/posts/new.html.erb
y escribe el siguiente
contenido en él:
<h1>New Post</h1>
Cuando refresques http://localhost:3000/posts/new, verás que la página tiene un título. La ruta, el controlador, la acción y la vista ahora están funcionando de manera armoniosa! Es hora de crear el formulario para un nuevo post.