Con el modelo terminado, necesitamos crearle un controlador. Nuevamente, usaremos el mismo generador que antes:
$ rails generate controller Comments
Esto crea seis diferentes archivos y una carpeta vacía:
Archivo/Carpeta | Propósito |
---|---|
app/controllers/comments_controller.rb | El controlador de Comments. |
app/views/comments/ | Donde se guardan las vistas del controlador. |
test/functional/comments_controller_test.rb | Las pruebas funcionales del controlador. |
app/helpers/comments_helper.rb | El helper de la vista. |
test/unit/helpers/comments_helper_test.rb | Las pruebas unitarias para el helper. |
app/assets/javascripts/comment.js.coffee | CoffeeScript para el controlador. |
app/assets/stylesheets/comment.css.scss | Hojas de estilo para el controlador. |
Como con cualquier blog, nuestros lectores crearán sus comentarios directamente
después de leer el artículo, y una vez que agregaron su comentario, serán
enviados de vuelta al artículo para ver su comentario ahora listado. Debido a
esto, nuestro CommentsController
está ahí para proveer un método para crear
comentarios y eliminar spam cuando aparezca.
Así que primero, vamos a armar la plantilla show
del artículo
(/app/views/posts/show.html.erb
) para que nos permita hacer comentarios:
<p>
<strong>Title:</strong>
<%= @post.title %>
</p>
<p>
<strong>Text:</strong>
<%= @post.text %>
</p>
<h2>Add a comment:</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
<p>
<%= f.label :commenter %><br />
<%= f.text_field :commenter %>
</p>
<p>
<%= f.label :body %><br />
<%= f.text_area :body %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
<%= link_to 'Edit Post', edit_post_path(@post) %> |
<%= link_to 'Back to Posts', posts_path %>
Ésto agrega un formulario en la vista show
del artículo que crea un
comentario al llamar a la acción create
en el CommentsController
. Al llamar
form_for
se necesita pasar un arreglo, que construirá una ruta anidada,
siguiendo el esquema /posts/1/comments
.
Armemos la acción create
:
class CommentsController < ApplicationController
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.create(params[:comment])
redirect_to post_path(@post)
end
end
Verás un poco más de complejidad aquí comparado a lo visto en el controlador de
artículos. Eso es un efecto secundario del anidado que estás usando. Cada vez
que se crea un comentario es necesario saber a que artículo pertenece. Por eso
la primera llamada al método find
del modelo Post
, para ubicar el artículo
en particular.
Además, el código trata de tomar ventaja de algunos de los métodos disponibles
a las asociaciones. Usamos el método create
en @post.comments
para crear y
guardar el comentario. Esto asociará automaticamente el comentario el artículo
en particular.
Una vez que hemos hecho el comentario nuevo, enviamos al usuario de vuelta al
artículo original usando el helper post_path(@post)
. Como hemos podido ver,
ésto luego llama a la acción show
en el PostsController
que hace render con
la plantilla show.html.erb
. Aquí es donde queremos mostrar los comentarios,
así que agreguemos app/views/posts/show.html.erb
.
<p>
<strong>Title:</strong>
<%= @post.title %>
</p>
<p>
<strong>Text:</strong>
<%= @post.text %>
</p>
<h2>Comments</h2>
<% @post.comments.each do |comment| %>
<p>
<strong>Commenter:</strong>
<%= comment.commenter %>
</p>
<p>
<strong>Comment:</strong>
<%= comment.body %>
</p>
<% end %>
<h2>Add a comment:</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
<p>
<%= f.label :commenter %><br />
<%= f.text_field :commenter %>
</p>
<p>
<%= f.label :body %><br />
<%= f.text_area :body %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
<%= link_to 'Edit Post', edit_post_path(@post) %> |
<%= link_to 'Back to Posts', posts_path %>
Ahora puedes agregar artículos y comentarios a tu blog, y hacer que se muestren en los lugares correctos.
Ahora que tenemos los artículos y comentarios funcionando, dale una mirada a la
plantilla app/views/posts/show.html.erb
. Se está volviendo larga y complicada.
Podemos usar parciales (partials) para simplificarla.