goals {
message "Ahora vamos a agrear un botón para que la gente pueda hacer clic para votar."
}
steps {
step "Agregar una nueva acción al controlador para votar" do
message "Edita `app/controllers/topics_controller.rb` para agregar un método como éste:"
source_code :ruby, <<-RUBY
def upvote
@topic = Topic.find(params[:id])
@topic.votes.create
redirect_to(topics_path)
end
RUBY
message <<-MARKDOWN
* `@topic = Topic.find(params[:id])` encuentra el tema en la base de datos con ese id y lo almacena en la variable `@topic`.
* `@topic.votes.create` crea un nuevo voto para el tema actual y lo guarda en la base de datos.
* `redirect_to(topics_path)` le dice al navegador que regrese a topics_path (la lista de temas).
MARKDOWN
end
step "Agrega una nueva ruta para votar" do
message "Abre `config/routes.rb` y encuentra la sección que se ve como esta:"
source_code :ruby, <<-RUBY
resources :topics
RUBY
message "Reemplaza esa línea para que quede como ésta:"
source_code :ruby, <<-RUBY
resources :topics do
member do
post 'upvote'
end
end
RUBY
message <<-MARKDOWN
Verifica que la ruta fue agregada exitosamente revisando en la salida de `rake routes` o [http://localhost:3000/rails/info](http://localhost:3000/rails/info). Deberías ver una línea como ésta:
```
Prefix Verb URI Pattern Controller#Action
upvote_topic POST /topics/:id/upvote(.:format) topics#upvote
```
MARKDOWN
end
step "Agrega el botón a la lista" do
message "Edita `app/views/topics/index.html.erb` para que el ciclo final se vea como esto:"
source_code :erb, <<-HTML
<% @topics.each do |topic| %>
<tr>
<td><%= topic.title %></td>
<td><%= topic.description %></td>
<td><%= pluralize(topic.votes.count, "vote") %></td>
<td><%= button_to '+1', upvote_topic_path(topic), method: :post %></td>
<td><%= link_to 'Show', topic %></td>
<td><%= link_to 'Edit', edit_topic_path(topic) %></td>
<td><%= link_to 'Destroy', topic, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
HTML
message <<-MARKDOWN
* `pluralize(topic.votes.count, "vote")` muestra el número de votos que tiene el tema, mas la palabra 'vote' o 'votes' correspondiente.
* `button_to '+1'` crea un botón html con el texto '+1'.
* `topic_upvote_path(topic)` crea la URL apropiada para la acción que queremos invocar. En este caso, queremos aumentar la cantidad de votos del tema actual.
* `topic_upvote_path(topic)` regresaría `/topics/42/upvote` (si topic.id fuera 42)
* `method: :post` asegura de que ejeutamos la acción crear del CRUD, no la acción leer.
MARKDOWN
end
step "Confirmar los cambios en el navegador" do
message "Regresa a <http://localhost:3000/topics> y juega."
message "Deléitate con el hecho de que no tuviste que reiniciar el servidor para ver los cambios. Conveniente, ¿no?"
end
}
insert 'considerar_lanzar_a_heroku'
next_step "redirigir_a_la_lista_de_temas_despues_de_crear_uno"