2011-01-05 29 views
6

Últimamente me he encontrado con algunas aplicaciones que están usando js.erb y no estoy seguro de cómo usarlo ... aquí está el código a continuación. ¿Alguien puede ayudarme a entender cómo funciona esto?¿Cómo funciona js.erb

en el archivo routes.rb

map.resources :player_emails 

mi regulador player_emails_controller.rb en la acción de crear

def create 
@player_email = PlayerEmail.create(params[:player_email]) 
if @player_email.save 
    @response_txt = "The player has been emailed." 
    PlayerEmailsMailer.deliver_pattern_email(@something, @player_email, request.host_with_port) 
    @error = false 
else 
    @error = true 
    @response_txt = "Please make sure you entered your name and a valid email address." 
end 
end 

entonces tengo el archivo player_emails/create.js.erb

$('#player_email_ind').hide(); 
$('#player_email_submit').show(); 
$('#player_response_msg').html("<%= escape_javascript @response_txt %>").fadeIn(); 
<% unless @error %> 
$('#player_email_form')[0].reset(); 
<% end %> 

Yo sé lo que va del jQuery, pero No sé cómo esto está haciendo el ajax llamada. ¿Se acaba de hacer automáticamente una llamada ajax cuando hay una js.erb ... puede alguien explicar la forma en que esto funciona y por qué no necesito un respond_to en la acción del controlador diciendo que esto es format.js

+1

tengo curiosidad por saber si hay un tutorial para escribir .js.erb por ahí ... –

Respuesta

3

¿Su forma de botón de envío tiene una :remote => true en él? Si es así, puede haber JavaScript en rails.js o application.js que se envía automáticamente a través de AJAX. En pocas palabras, debe haber algún JavaScript en alguna parte que esté haciendo una llamada AJAX y solicitando una respuesta js o JSON, de lo contrario sería una solicitud html.

En cuanto a por qué no necesita un bloque respond_to, no estoy del todo seguro. Tal vez dado que AJAX siempre hace la llamada y hay una plantilla js.erb disponible, simplemente hace lo suyo sin quejarse. ¿Hay una plantilla html.erb en absoluto? De lo contrario, intente enviar un formulario de forma regular y verifique si se queja.

6

Si se realiza una solicitud js (ajax) responderá representando el archivo js.erb y viceversa.

Este es el comportamiento por defecto que se está realizando:

respond_to do |format| 
    format.js{ 
     render :template => 'create.js.erb' 
    } 
    format.html{ 
     render :template => 'create.html.erb' 
    } 
    end 
5

Cuando se envía el formulario, lo hace un POST a /player_emails. La declaración de recursos en routes.rb asegura que la solicitud se maneja por PlayerEmailsController#create.

El controlador es responsable de manejar cada formato que recibe. En el caso de una llamada AJAX, el formato es 'js' y se establece agregando explícitamente la cadena de formato al final de la URL (/player_emails.js) o (más probablemente) deduciendo el formato del encabezado de la solicitud.

En su caso, la acción create no espera nada más que AJAX, por lo que toma un atajo y omite los bloques respond_to y format. El controlador ya ha determinado que el formato es 'js', por lo que cuando se completa create, toma la acción predeterminada de representar la plantilla adecuada para el formato (create.js.erb).

Cuestiones relacionadas