2012-03-02 8 views
6

Tengo una página con pestañas y quiero simplemente representar parciales diferentes a través de ajax cuando se hace clic en las pestañas. Tengo un código, pero no creo que sea el más eficiente. Tenía la esperanza de que si alguien puede ayudarme con mi código que ya está en su lugar o si hay un método más fácil, lo apreciaría mucho. ¡Gracias!Rieles: Parciales de representación a través de Ajax

HTML Tab

<li class='StreamTab StreamTabRecent active'> 
<%= link_to 'Most Recent', mostrecent_schools_path, :remote => true, :class => 'TabText' %> 
</li> 


<div id='ContentBody'> 
<div id='ajax'></div> 
<%= render 'users/microposts', :microposts => @microposts %> 
</div> 

controlador Escuela

class SchoolsController < ApplicationController 
    def mostrecent 
    @school = School.find_by_slug(request.url.gsub('http://localhost:3000/','')).id 
    @microposts = @user.microposts.order('created_at DESC').paginate(:per_page => 3, :page => params[:page]) 
    respond_to do |format| 
     format.html 
     format.js 
    end 
    end 
end 

más recientes El JS

$("#ContentBody").html('<%= escape_javascript(render :partial => "users/microposts")%>'); 

Rutas

resources :schools do 
    collection do 
     get :mostrecent 
    end 
    end 
+0

"Tengo un código pero no creo que sea el más eficiente". ¿El código anterior funciona correctamente? ¿Desea optimizar este proceso o desea un código de trabajo en primer lugar? – prasvin

+0

@prasvin Ese código no funciona, estaba tratando de hacerlo funcionar a partir de algo que encontré en Internet antes, pero no estoy seguro de cómo hacerlo funcionar o si es la forma más eficiente. Si hay una manera mejor de hacer esto, soy todo un oídos para aprender :) – Kellogs

Respuesta

10

Ver mi respuesta a un post anterior. Esto le dará una idea AJAX in Rails: Show model#new form after completing a model#update

Lo que puede hacer es renderizar un json en la acción y pasar el parcial como json.

def mostrecent 
    @school = School.find_by_slug(request.url.gsub('http://localhost:3000/','')).id 
    @microposts = @user.microposts.order('created_at DESC').paginate(:per_page => 3, :page => params[:page]) 
    respond_to do |format| 
    format.json { render :json => {:success => true, :html => (render_to_string 'users/microposts')} } 
    format.html { } 
    end 
end 

Puede acceder a la JSON en sus js (es decir, un archivo javascript/CoffeeScript como mostrecent.js o mostrecent.js.coffee) y sustituir el elemento actual.

$('.TabText').live 'ajax:success', (event,data) -> 
    $('#ContentBody').html(data.html) if(data.success == true) 
+0

Aprecio mucho :) – Kellogs

+1

Escriba de nuevo si lo anterior no funciona, o no está seguro de algo. El código no ha sido probado, pero debería acercarlo bastante para lograr su tarea. – prasvin

+0

Nunca utilicé json pero imagino en lugar de un archivo js ¿Creé un archivo json y lo agregué a él? – Kellogs

2

La respuesta de Prasvin es inmediata. Volver y ejecutar JS puede parecer simple pero hace que la depuración sea mucho más desagradable. ¿Cómo se establece un punto de interrupción en JS que se devolvió a través de AJAX? En su lugar, debe incluir todos sus JS en la página y solo devolver los datos.

0

estoy usando carriles de 4.2 y @prasvin respuesta me apunta en la dirección correcta, pero cuando utilicé

format.json { render :json => {:success => true, :html => (render_to_string 'instruments')} } 

me gustaría conseguir un error "Falta plantilla ... instrumentos ..."

Después de leerlo encontré este comentario rails render_to_string giving errors with partial view. @marcel mencionó que necesita especificar que el archivo es parcial, parcial: 'instrumentos', como se muestra a continuación:

format.json { render :json => {:success => true, :html => (render_to_string partial: 'instruments')} } 
Cuestiones relacionadas