2011-01-22 22 views
11

Estoy tratando de obtener un link_to para mostrar un parcial a través de jquery ajax, pero parece que no funciona (edit: return blank screen) e I ' No estoy seguro de lo que me estoy perdiendo. Cualquier ayuda sería apreciada.Rails 3 - link_to to call partial using jquery ajax

me gustaría hacer clic en el enlace "Vista previa Widget" y tienen que mostrar _widget.html.erb en el div vista previa.

Desde mi entender el enlace "Vista previa de widgets" debe llamar a la acción def preview_widget que exige preview_widget.js.erb que a su vez hace que el parcial _widget.html.erb en el div.

EDIT: enlace de actualizaciones de acuerdo con las sugerencias Ignacio Reza

show.html.erb

<%= link_to "Preview Widget", :action => 'preview_widget' , :id => @widget.id, :remote => true %> %> 
<div id="preview"></div> 

widget_controller.rb

def preview_widget 
    respond_to do | format | 
     format.js {render :layout => false} 
    end 
end 

preview_widget.js. er b

$("#preview").html("<%= escape_javascript(render(:partial => "widget", :locals => { :widget => @widget})) %>"); 

_widget.html.erb

<% @widget.videos.each do |video| %> 
     <h3><a href='#'><%= video.name %></a></h3> 
     <div> 
     <object height='316' width='540'> 
      <embed style='border: 1px solid #333333;' height='316' width='540' allowfullscreen='true' allowscriptaccess='always' type='application/x-shockwave-flash' src='<%= video.url %>'> 
     </object> 
     </div> 
    <% end %> 

routes.rb

match 'preview_widget' => 'widgets#preview_widget' 

Respuesta

5

No es aclaró en su pregunta, lo que "parece que no puede haz que funcione "... pero por lo que veo en el código que diste ... todo parece correcto, pero te pierdes la llamada de ajax real ...

que se podrían añadir añadiendo: retirado => true al enlace "Vista previa de widgets", tales como:

<%= link_to "Preview Widget", :action => 'preview_widget' , :id => @widget, :remote => true %> 

si el comportamiento por defecto es suficiente .. o se puede inscribir su propia llamada personalizada en ajax application.js ..

Como nota, no creo que establecer el atributo: id del enlace "Vista previa del widget" a @widget es sabio ... ya que pondrá la representación de cadena del widget, que por lo general se verá como "< Widget: 0x12412 .. >" quizás sería mejor cambiarlo a "widget-link-#{@widget.id}"

+0

Gracias. He agregado el: remote => verdadero al código y fijo widget-link-#{@widget.id}. El enlace ahora es "http: // localhost: 3000/preview_widget? Id = 1 & remote = true" cuando hago clic en él obtengo una página en blanco? – pagetribe

+0

¿Qué versión de rieles usaste? supongo que usaste 3. * cuando sugiero agregar ": remote => true" ... como comenzando en 3.0, Rails usó el enfoque javascipt discreto para manejar todas las características relacionadas con Javascript ... si estás usando 2. *. . luego necesita cambiar link_to a remote_link_to, y opcionalmente eliminar el ": remote => true" .. –

6

Ok, finalmente conseguí que esto funcione con los siguientes cambios.
routes.rb (miembro añadido al widget de recursos)

resources :widgets do 
    member do 
     get 'preview_widget' 
    end 
    end 

show.html.erb

<%= link_to 'Preview', preview_widget_widget_path(:id => @widget.id), :remote => true %> 

Este muestra ahora la parcial (link_to para que coincida con rutas cambiado). Todavía no estoy 100% seguro de lo que estaba mal con el código anterior, al menos ahora funciona.

4

Tengo un problema similar que me llevó a esta amenaza, así que pensé que compartir mi solución aquí podría ser útil para cualquiera.

Con :remote => true tengo una petición HTTP normal a http://localhost:3000/info/about?remote=true en lugar de la petición Ajax querido http://localhost:3000/info/about

La solución fue fácil, pero difícil de encontrar!

En mi HAML Vista:

código incorrecto que desencadena solicitud HTTP

= link_to(image_tag("icons/information.png", :title => t('menu.info')), :controller => "info", :action => "about", :remote => true) 

OK-Code que desencadena AJAX Solicitud

= link_to(image_tag("icons/information.png", :title => t('menu.info')), {:controller => "info", :action => "about"}, :remote => true) 

La única diferencia es {entre llaves }!

Aunque es gracioso que con la solicitud AJAX recibo info/about.html prestados, sin el archivo de diseño. Lo cual no es parcial, pero está cerca de lo que Jan quería. Esperaba que se renderizara info/about.js.erb.

En InfoController

def about 
    respond_to do |format| 
     format.html # renders ‘views/info/about.html.erb’ inside layout template on HTTP Request 
     format.js# renders ‘views/info/about.html.erb’, without layout 
    end 
    end 

-

def about 
    respond_to do |format| 
     format.html # => ‘views/info/about.html.erb’ inside layout template on HTTP Request 
     format.js {render 'about.js'} # => renders ‘views/info/about.js.erb’ 
    end 
    end 
Cuestiones relacionadas