Je souhaite mettre à jour un formulaire via ajax sans recharger la page et mettre à jour la vue en conséquence. J'ai essayé les différentes méthodes et j'ai échoué car je ne connaissais pas encore Rails.
Voici la situation.
En modal
def new
@new_entry = current_user.notes.build
@words = current_user.notes
@notes_false_list = current_user.notes.where(known: false).order("title").group_by { |note| note.title[0] }
@notes_true_list = current_user.notes.where(known: true).order("title").group_by { |note| note.title[0] }
end
Voir le code du formulaire.
<%= form_for @new_entry, :html => {:class => 'home-form without-entry clearfix'} do |f| %>
<%= f.text_field :title, placeholder: 'Squirrel', autofocus: true, class: 'title-field pull-left' %>
<%= f.submit '', class: 'btn home-add without-entry' %>
<% end %>
L'action de création
def create
@new_note = current_user.notes.build(new_note_params)
if @new_note.save
@notes_list = current_user.notes.count
unless @new_note.user.any_entry
@new_note.user.toggle!(:any_entry) if @notes_list >= 50
redirect_to root_url
end
else
redirect_to root_url
end
end
et enfin dans la vue je veux changer
<p class="instructions count-instruction text-center">
<%= @words.count %>
</p>
Nous avons passé beaucoup de temps à mettre cela à jour avec AJAX, mais nous avons échoué à chaque fois. Y a-t-il de l'aide? Merci d'avance.
votre code est bon, mais pour ajax,
vous devez ajouter remote=true
à votre formulaire.
<%= form_for(@image,:html=>{:id=>"your_form_id",:multipart => true,:remote=>true}) do |f |%>
De plus, côté serveur, vous devez créer un fichier js.erb dans views/users/show_updated_view.js.erb
pour répondre au navigateur en tant qu’appel js Et NON en HTML, et par conséquent nécessaire. montrer à l'utilisateur que quelque chose s'est passé (succès/erreur) après la soumission du formulaire (si son users_controller
),
si dans votre action, vous avez besoin de quelque chose comme: -
respond_to do |format|
format.js { render 'users/show_updated_view'}
end
Et dans show_updated_view.js.erb
, vous devriez mettre à jour votre vue pour les utilisateurs afin de savoir Que la vue a été mise à jour ou que le formulaire a été soumis avec succès. Soit en masquant le formulaire complet/en réinitialisant le formulaire, soit en remplaçant le formulaire par une nouvelle div indiquant que les données sont mises à jour .. ou que tout ce qui est intuitif.Il existe de nombreuses façons :).
// ici je remplace tout votre formulaire par div ayant un message
$("#your_form_id").html("<div><p>You have submitted the form successfully.</p></div>")
;
_ {Le nom de la vue peut être n'importe quoi mais vous devez vous occuper de la réussite et de l'échec.} _
Voici un court article sur la pratique de AJAX avec Rails . Quelques points à noter:
remote: true
dans votre form_for
.Dans create.js.erb , procédez comme suit (non testé):
$("p.instructions").innerHTML("<%= @notes_list %>")
La chose à retenir avec AJAX est que vous ne redirigez pas la demande (normalement), vous générez simplement du texte à renvoyer au navigateur. AJAX est fondamentalement juste du javascript pour extraire du texte du navigateur et en faire quelque chose. Souvent, vous voudriez remplacer une section de la page, c'est-à-dire remplacer une balise html et son contenu, par le texte que vous récupérez, auquel cas vous voulez que le texte soit du html. Pour rendre une partie du code HTML dans Rails, vous devez effectuer un rendu partiel. Ainsi, vous utilisez souvent du javascript pour indiquer au navigateur quoi faire avec le texte, généralement pour remplacer un élément ayant un identifiant spécifique avec le texte.
def create
@new_note = current_user.notes.build(new_note_params)
if @new_note.save
@notes_list = current_user.notes.count
unless @new_note.user.any_entry
@new_note.user.toggle!(:any_entry) if @notes_list >= 50
end
end
respond_to do |format|
format.html { redirect_to root_url }
format.js #default behaviour is to run app/views/notes/create.js.erb file
end
end
le bloc respond_to ici vous permet de traiter différemment les requêtes html et js (par exemple, ajax).
App/views/notes/create.js.erb pourrait avoir quelque chose comme:
page.replace "foo", :partial => "app/views/notes/bar"
Essayez d'ajouter respond_to block dans l'action de votre contrôleur "create", et respectez create.js.erb et indiquez dans votre js que vous souhaitez exécuter après l'action de création, et publiez toute erreur que vous obtenez sur votre console du navigateur ou de la console du serveur Rails, nous pouvons vous aider à localiser votre erreur.