Página en blanco al renderizar un parcial con ajax en rails 3

Tengo un menú de navegación con 2 pestañas/enlaces en el show.html.erb presentar en UsersController.rb, me gustaría usar ajax para generar diferentes parciales para las pestañas.

En la columna show.html.erb Tengo un div llamado profile-data donde quiero mostrar el contenido. Así que hago algo como esto:

La estructura del enlace:

<li><%= link_to "College friends", college_friends_path, :remote => true %></li>
<li><%= link_to "Highschool friends", highschool_friends_path, :remote => true %></li>

Defino las rutas:

match "college_friends" => "users#college_friends", :as => "college_friends"
match "highschool_friends" => "users#highschool_friends, :as => "highschool_friends"

Y defino en mi UserController.rb los métodos necesarios:

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end

  def college_friends
    respond_to do |format|
      format.js
    end
  end

  def highschool_friends
    respond_to do |format|
      format.js
    end
  end
end

Lo último que tenemos son los archivos JS:

*college_friends.js.erb*

$('#profile-data').html("<%= escape_javascript(render(:partial => 'college_friends')) %>");

*highschool_friends.js.erb*

$('#profile-data').html("<%= escape_javascript(render(:partial => 'highschool_friends')) %>");

El código parcial: _college_friends.html.erb

<% groups = @user.friends.group_by(&:college_name) %>
<% sorted_groups = groups.sort_by{|key, values| values.count}.reverse %>
<% sorted_groups.each do |collegename, friends| %>
<% next if collegename.blank? %>
<div class="contentbox">
    <div class="box-header">
        <h3><%= collegename %></h3>
        <div class="meta-info">
            <p><i class="icon-map-marker"></i> Malmö</p>
            <p><i class="icon-user"></i><span class="count"> <%= friends.count %></span> vänner</p>
        </div>
    </div>
    <ul class="friends-list">
        <% friends.map do |friend| %>
        <li><%= image_tag(friend.image) %>
            <% end %> 
        </ul> 
    </div>
<% end %>

Así que resuelvo este problema pero revisando la fuente de entrada y salida. Y noté que los archivos js no se cargaron en la aplicación.

Entonces cambié esto:

<%= javascript_include_tag :defaults %>

A esto:

<%= javascript_include_tag "application" %>

Y cargó todos los archivos js necesarios.

Pero luego me sale este error:

ActionView::Template::Error (undefined method `friends' for nil:NilClass):

preguntado el 28 de julio de 12 a las 02:07

¿Qué hay en los parciales college_friends y highschool_friends? Debe tener _college_friends.format.erb y _highscool_friends.format.erb en la misma carpeta para que esto funcione -

@anthonyalberto, recibo este error Si hago lo que digo: Falta la plantilla -

_college_friends.format.erb => ¿reemplazó .format con el formato actual? En este ejemplo, debería ser .js.erb, ¡supongo! -

2 Respuestas

Te estás poniendo

ActionView::Template::Error (undefined method `friends' for nil:NilClass):

Porque

<% groups = @user.friends.group_by(&:college_name) %>

requiere @user para ajustar.

Como sugirió Brandon, intente

def college_friends
  @user = User.find(params[:id])
  respond_to do |format|
    format.js
  end
end

PERO

Para lograr esto, debe cambiar sus rutas de enlace para incluir una identificación de usuario, similar a esto

match "college_friends/:id" => "users#college_friends", :as => "college_friends"

y en tus enlaces

<li><%= link_to "College friends", college_friends_path(@user), :remote => true %></li>

Respondido 29 Jul 12, 22:07

¡Gracias! Funciona, pero hace un nuevo requerimiento a la base de datos cada vez que cambia las pestañas... y eso es muy ineficiente. ¿Tienes alguna otra idea sobre cómo puedo repensar esto? Todavía voy a darte la respuesta. - usuario592638

Me alegro si ayudó. Piensa que puedes hacer una nueva pregunta o buscar un poco tu nuevo problema. Pero le sugiero que presente todo en una sola solicitud y "muestre/oculte" la parte relevante de su página cuando el usuario haga clic en los enlaces. Ahora no enviará una nueva solicitud al servidor, en su lugar, solo activará algunos js ocultando o mostrando pestañas de amigos. Pero esta vez 'puede' no tener datos actualizados. Ese es otro problema también :) - Alper Karapinar

Como se sugiere en los comentarios anteriores, debe tener dos parciales llamados _college_friends.html.erb y _highschool_friends.html.erb

Estos contendrán su HTML, que es lo que desea cargar a través de $('#profile-data').html()

Error de plantilla:

Tu no estas definiendo @user in college_friends y highschool_friends. Así que tu vista está solicitando @user de esa acción, que no está.

Respondido 29 Jul 12, 19:07

¡Por supuesto que tengo dos parciales que se llaman así! Ese no es el problema - usuario592638

¿En qué directorio de vistas se guardan? "Falta plantilla" dice que no tiene un parcial para cargar. ¿Podrías pegar el mensaje de error completo? Sospecho que está buscando en vistas/usuarios/ - brandon jernigan

Reparo el error de la plantilla. Todo lo que obtengo ahora es una página en blanco... envía la página a localhost/users/college_friends - user592638

¿Puedes publicar tu código parcial? Además, verifique las solicitudes http en su navegador para asegurarse de que se devuelva algo cuando se haga clic en el enlace. - brandon jernigan

verifique la actualización. ¿Qué quieres decir con que algo está siendo devuelto? - usuario592638

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.