J'écris une application qui permettra à un utilisateur d'ajouter un composant à une page particulière dans ma base de données, mais je suis coincé sur un petit peu de la JS.Soumission de formulaire Rails et Ajax
J'ai le formulaire de soumission très bien. Je suis bloqué sur la façon de "rafraîchir" le div conteneur qui montre tous les composants actuels liés à une page.
Je viens d'un environnement PHP, donc je sais que je pourrais écrire une méthode dans mon modèle et y faire un appel ajax et utiliser simplement jQuery pour repeupler le conteneur div. Comment ferais-je cela dans Rails? Ou y a-t-il une meilleure façon de faire cela?
Forme:
<div class="add_component_block" style="display: none">
<%= form_for page, :url => page_url(page), :class => "edit_page" do |p| %>
<div class="field">
<%= select_tag :component_id, options_for_select(@components.collect { |comp| [comp.name, comp.id] }), :include_blank => 'Select a Component' %>
</div>
<div class="action">
<%= p.submit :Submit %>
</div>
<% end %>
</div>
jQuery:
$('#page_submit').click(function(e){
$.ajax({
url: $('.edit_page').attr('action'),
type: "PUT",
data: "component_id=" + $('#component_id').val(),
success: function(data){
location.reload();
}
});
return false;
});
Merci à l'avance pour l'aide!
Code du travail
Contrôleur:
def create
if !params[:component_id]
@component = Component.new(params[:component])
respond_to do |format|
if @component.save
params[:page_id].each { |p|
PagesComponent.create({ :page_id => p, :component_id => @component.id })
} unless params[:page_id].nil?
format.html { redirect_to(@component, :notice => 'Component was successfully created.') }
format.xml { render :xml => @component, :status => :created, :location => @component }
else
format.html { render :action => "new" }
format.xml { render :xml => @component.errors, :status => :unprocessable_entity }
end
end
else
@component = PagesComponent.new(:page_id => params[:page_id], :component_id => params[:component_id])
if @component.save
@all_components = Page.where("id = ?", params[:page_id])
@component_list = []
@all_components.each do |pc|
pc.components.each do |c|
@component_list << c.name
end
end
render :json => @component_list
end
end
end
jQuery:
$('#page_submit').click(function(){
$('.add_component_block').hide();
$.ajax({
url: $('.edit_page').attr('action'),
type: "POST",
data: "component_id=" + $('#component_id').val(),
success: function(data){
console.log(data)
$('#page_components').empty();
$.each(data, function(i, itemData){
$('#page_components').append("Name: " + itemData + "<br />")
});
}
});
return false;
});
merci pour l'aide! J'ai mis dans mes éditions ci-dessus à ce que j'ai fini par faire ... cependant, j'ai un nouveau problème. Lorsque le post est terminé, je réécris mon HTML avec les données qui reviennent, mais la liste qui revient est regroupée par nom par rapport à l'ordre dans la base de données ... de toute façon pour résoudre ce problème? Mon code est inclus ci-dessus ainsi – dennismonsewicz
Difficile de savoir à quoi ressemble votre modèle, mais est-il possible que l'ordre naturel et l'ordre alphabétique soient par coïncidence les mêmes? Rails ne modifie en rien l'ordre du jeu de résultats sauf si vous spécifiez le paramètre: order. Regardez votre journal/development.log et vous pouvez examiner le SQL qui est utilisé. BTW: Félicitations pour arriver à ce point. Tu le fais bien. –