Я просмотрел ваши источники. ИМХО, лучший способ достичь своей цели - это сделать это способом Rails. Я имею в виду, что вы уже используете скрипт jquery rails. Таким образом, вы можете легко придерживаться UJS с подходом RJS в вашем приложении rails 3:
В форме:
form_for(@quote, :remote => true) do |f|
В контроллере:
def create
@quote = Quote.new(params[:quote])
respond_to do |format|
if @quote.save
format.html { redirect_to(@quote, :notice => :quote_created) }
format.xml { render :xml => @quote, :status => :created, :location => @quote }
format.js
else
format.html { render :action => "new" }
format.xml { render :xml => @quote.errors, :status => :unprocessable_entity }
format.js
end
end
end
В create.js.erb (ниже синтаксис HAML ):
- if @quote.errors.any?
$('#data_form').html('#{escape_javascript(render(:partial => "form"))}');
- else
$('ul.data_grid').prepend('#{escape_javascript(render :partial => "quote", :locals => { :quote => quote })}');
Вы можете заключить форму в #data_form
, а список цитат - в ul.data_grid или изменить селекторы в create.js.erb
. Также в этом файле вы можете очистить форму при успехе и показать флеш-сообщения или все, что вам нужно здесь.
В конце концов, не забудьте выбросить этот код из application.js (он больше не нужен):
$("form.new_quote > .actions > [type=submit]").live("click", function() {
$.post('/ajax_new', $('form.new_quote').serialize(), function(resp) {
resp = $.parseJSON(resp);
if (resp[0].done == "ok") {
$(".msg").css("background-color", "#00fe00").text("Ok").fadeIn('slow').delay(5000).fadeOut('slow');
$("#quote_author,#quote_body").each(function(i,e) {
$(this).val("");
});
}
});
return false;
});