2011-08-30 17 views
14

La mia configurazione: Rails 3.0.9, Ruby 1.9.2, jQuery 1.6.2jQuery post per Rails

Ho una forma che mostra più foto e commenti per un utente e desidero implementare in linea commentare.

<div id="newsfeed">  
<div> 
<div class="photo_title">Summer 2011</div> 
<div class="newsfeed_photo"> 
<a href="..." /></a> 
</div> 
<textarea class="comment_box">Write a comment...</textarea> 
</div> 
<div> 
<div class="comment_title">Seeing a movie</div> 
<textarea class="comment_box">Write a comment...</textarea> 
</div> 

Desidero inviare un post AJAX sull'utente che preme il tasto Invio nel campo textarea. Ecco il javascript (incompleto) che ho finora

$('#newsfeed').delegate('.comment_box', 'keydown', function (event){ 
    event.preventDefault(); 
    $.post('/sub_comments', ...); 
    }); 

sto usando il metodo delegate perché <div id='newsfeed'> contenuti potrebbero essere sostituiti con un'altra chiamata AJAX. Quello che mi serve è la sintassi per il metodo jQuery post supponendo che ho bisogno di passare alcuni parametri come ad esempio photo_id, ecc. Supponiamo che io abbia un modo per accedere ai valori per i parametri, qual è la sintassi per la chiamata post alla creazione di parametri nel modo Rails si aspettano loro

Ecco le guide standard i bit

sub_comments_controller.rb 

    def new 
    @sub_comment = SubComment.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.js 
    end 
    end 

anche io non voglio usare la solita <%= form_for(@sub_comment, :remote => true) do |f| %> per ogni linea commentare potrei aggiungere. Ho anche dato uno sguardo a Ryan Bates railscast ma il codice sembra obsoleto.

risposta

29

È possibile impostare il proprio post in modo da strutturare i dati in qualsiasi modo, purché sia ​​interpretato correttamente sull'estremità dei binari, ma è consigliabile avere un oggetto di "nome modello" con tutti i valori.

Javascript

$.ajax({ 
    url: "/sub_comments", 
    type: "POST", 
    data: {subcomment: { 
      field: val, 
      field2: val, etc... }}, 
    success: function(resp){ } 
}); 

Rails

def create 
    @sub_comment = SubComment.new params['subcomment'] 
    if @sub_comment.save 
    render :json => { } # send back any data if necessary 
    else 
    render :json => { }, :status => 500 
    end 
end 
+1

Ti dispiacerebbe spiegare perché si è scelto di non utilizzare un blocco 'respond_to' per favore? grazie! –

+0

davvero utile, hai risparmiato il mio tempo, @ cmpolis, grazie mille –

+2

@MarioZigliotto Lo ha fatto solo perché è più breve da scrivere. Le conseguenze sono che non può rendere html in questa azione, solo json. – DonPaulie