En el capítulo 12.2.5 del tutorial de Rails, se introduce Ajax para "enviar solicitudes de forma asíncrona al servidor sin salir de la página". Luego, el método respond_to se usa en el controlador para permitir que los navegadores con javascript habilitado usen Ajax o respondan con una redirección en caso de que Ajax esté deshabilitado.
El formulario utilizado para crear una relación entre dos usuarios es:
<%= form_for(current_user.active_relationships.build, remote: true) do |f| %> <div><%= hidden_field_tag :followed_id, @user.id %></div> <%= f.submit "Follow", class: "btn btn-primary" %> <% end %>La acción correspondiente en el controlador de relaciones es:
def create @user = User.find(params[:followed_id]) current_user.follow(@user) respond_to do |format| format.html { redirect_to @user } format.js end end Lo que le da a Rails la oportunidad de usar Ajax es la adición de remote: true en el método auxiliar form_for . De acuerdo con el tutorial, es necesario que el controlador use la variable de instancia @user en lugar de la variable local user para usar en el formulario con remote: true .
Sin Ajax, el formulario resultante sería idéntico excepto por el remote: true , y en el controlador, la sección de código respond_to sería reemplazada por redirect_to; además, la variable de instancia @user puede ser reemplazada por la variable local user , por lo que la acción de creación sería:
def create user = User.find(params[:followed_id]) current_user.follow(user) redirect_to user end Me pregunto: ¿por qué es necesario que el controlador use la variable de instancia @user en lugar de la variable local user para usar Ajax? Traté de usar la variable local y, en efecto, se requiere una actualización para ver cualquier cambio. La variable @user en el formulario, que se usa en @user.id , se define en la acción show para el controlador de usuarios, porque el parcial del formulario en sí se inserta en el archivo show.html.erb . Entonces, según tengo entendido, no hay conexión entre @user en el controlador de usuarios y @user en el controlador de relaciones.
Debe declararlo como variable de instancia (@) para que esté disponible en su vista. Sí, al usar ajax no está recargando la página, pero está enviando js en lugar de html. Rails responderá con lo que esté en create.js.erb . Tenga en cuenta que en este archivo necesita acceso a los datos de @usuario; si lo declara como user en lugar de @user , no será accesible:
#app/views/relationships/create.js.erb $("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>"); $("#followers").html('<%= @user.followers.count %>');