2010-09-15 7 views
5

Ho un modulo di posta elettronica. Ma sto facendo un modulo di e-mail di prova in cui un utente può aggiungere un'e-mail univoca e fare in modo che il test dell'e-mail lo invii a quella particolare email.Come si fa a passare AJAX vars da jQuery al proprio controller?

Per semplificare, ho deciso di eseguire l'e-mail di prova tramite ajax e inserire l'intero contenuto nell'altro modulo di posta elettronica.

io non riesco a capire come inviare le variabili dal mio HAML al mio controller

new.html.haml

- form_tag admin_email_blast_path do 
    Subject 
    %br 
    = text_field_tag 'subject', :class => "mass_email_subject" 
    %br 
    Body 
    %br 
    = text_area_tag 'message', '', :name => 'editor1', :class => "mass_email_body" 
    %br/ 
    = submit_tag 'Send Email', :class => 'button' 

    .grid_3.right.align_right.suffix_1 # <= TEST EMAIL :D 
    = text_field_tag 'email', nil, :style => "width: 150px;", :class => "test_email_address" 
    = link_to 'Test Email', test_email_admin_email_blast_path, :class => 'button test_email' 

JS

$(".test_email").live("click", function() { 

    var email = $(".test_email_address") 
    var subject = $(".mass_email_subject"); 
    var body = $(".mass_email_body"); 

    data = "email=" + email.val() + "&subject" + subject.val() + "&body" + body.val(); 

    $.ajax({type: "GET", 
      url: $(this).attr("href"), 
      dataType: "script" 
      data: data 
      }); 
    return false; 
}); 

Controller

def test_email 
    debugger 
    email = params[:email] 
    subject = params[:subject] 
    body = params[:body] 
    Notifier.deliver_email_blast(email, subject, body) 
end 

routes.rb

admin.resource :email_blast, :member => { 
           :test_email => :get 
           } 

mi scuso in anticipo se questa è una domanda stupida newbie. :(

+1

test_email_admin_email_blast_path accetta richieste GET? (Prova "rake routes | grep test_email_admin_email_blast" per vedere come Rails interpreta i tuoi percorsi.rb) – tobym

+0

Sì. test_email_admin_email_blast GET /admin/email_blast/test_email(.:format) {: controller => "admin/email_blasts",: action => "test_email"} – Trip

risposta

7

è possibile utilizzare il parametro data:

$('.test_email').live('click', function() { 

    var subject = $('.mass_email_subject'); 
    var body = $('.mass_email_body'); 

    $.ajax({ 
     type: 'GET', 
     url: this.href, 
     dataType: 'script', 
     data: { subject: subject.val(), body: body.val() } 
    }); 
    return false; 
}); 
+0

Sì, ma come si collega al controller delle mie guide? Come imposto i vars per il mio Notifier? – Trip

+1

Tutto ciò che fa è inviare una richiesta AJAX a '/ testemail /? Subject = foo & body = bar' ed esegue il javascript restituito da questa azione del controller. –

+0

Giusto. Ho capito quella parte. Ma non risponde alla mia domanda su come queste variabili possano essere lette dal controller delle rotaie. Apprezzo comunque l'aiuto. – Trip

3

Supponendo che si stanno ottenendo il submit di lavorare correttamente sulla base Darin Dimitrov risposta allora è necessario utilizzare l'oggetto params In questo caso sembra che tutti. quello che dovete fare è params di accesso [: secondo] e params [: corpo]. nella vostra azione di controllo

EDIT:.

in risposta al commento, GET e POST fanno alcuna differenza per params Se il modulo non funziona, prova si modifica JS da usare serializzare e restituire un errore in caso di fallimento:

$(".test_email").live("click", function() { 

    var subject = $(".mass_email_subject") 
    var body = $(".mass_email_body") 

    $.ajax({type: "GET", 
      url: $(this).attr("href"), 
      dataType: "script" 
      data: $('#form_id').serialize(), 
      error: function(){ alert("There was a problem, please try again.") } 
      }); 
    return false; 
}); 

Se ancora non funziona allora è meglio guardare per vedere se la vostra azione di controllo è stato colpito a tutti.

+0

Il modulo sottostante non funziona. I vars non passano a params [: subject], o a nessuno degli altri. È perché è un "GET" e non un "POST"? Ho provato entrambi, assicurandomi che il mio membro di rotta fosse: una richiesta di posta. Quando la richiesta routes.rb e la richiesta ajax sono POST, allora viene visualizzato il messaggio "Sono consentite solo richieste post". quando entrambi sono GET, ottengo un parametro zero. – Trip

+0

Il controller viene colpito. Ho messo un debugger poco prima quando ho definito i parametri. Ma una volta arrivato lì, sono tutti definiti come 'nil'. Strano, vero? Ho provato il tuo metodo serialize() e ho inserito un ID univoco attorno al mio modulo e non lo ha dato. – Trip

+1

Dove si trova esattamente il debugger ... dopo 'def test_email'? – tobym

Problemi correlati