Otras Páginas

Expandir Todo

permitir_votar.step

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"