2011-02-16 46 views

Respuesta

13

Lo que hago es hacer un controlador de rieles producir una acción de JavaScript. ¿Lo tiene llamar un parcial que tiene javascript incluido en él?

A menos que desee que se active en la carga de página, lo configuraría a través de AJAX. Para que haga una llamada AJAX al controlador que luego llama a un archivo javascript.

Esto se puede ver a través de la votación:

Primero el AJAX

//This instantiates a function you may use several times. 

jQuery.fn.submitWithAjax = function() { 
    this.live("click", function() { 
    $.ajax({type: "GET", url: $(this).attr("href"), dataType: "script"}); 
    return false; 
    }); 
}; 

// Here's an example of the class that will be 'clicked' 
$(".vote").submitWithAjax(); 

Segundo Controlador

La clase $(".vote") que se ha hecho clic tenía un atributo href que llama a mi controlador.

def vote_up 
    respond_to do |format| 
    # The action 'vote' is called here. 
    format.js { render :action => "vote", :layout => false } 
    end 
end 

Ahora el controlador carga un archivo de AJAX

// this file is called vote.js.haml 
== $("#post_#{@post.id}").replaceWith("#{ escape_javascript(render :partial => 'main/post_view', :locals => {:post_view => @post}) }"); 

Usted ha llamado con éxito una función de JavaScript desde un controlador.

+0

¿Es posible llamar a una función dentro de vote.js.haml? ¿Cómo podría pasar una variable cuando realiza la llamada a la función? –

+0

¿Es este un método de carriles o un método js? Puede pasar variables a su archivo .js desde su controlador. Entonces en el caso de mi ejemplo, @post se describe en la acción del controlador para 'def vote' como' @ post' .. etc. – Trip

+0

Una nota importante para esta configuración es que la función link_to para ".vote" debería tener 'remote: true' para llamar a js en lugar de representar una nueva página al hacer clic. – mpgarate

0

No, pero podría generar javascript que se llamaría inmediatamente en su vista, p.

<script type="text/javascript"> 
    function IWillBeCalledImmediately() 
    { 
     alert('called'); 
    }; 
    IWillBeCalledImmediately(); 
</script> 

Sin embargo, probablemente sería mejor usar jquery y usar el evento listo.

<script type="text/javascript"> 
    $(function() { 
      alert('called'); 
     }); 
</script> 
Cuestiones relacionadas