[Ruby on Rails] Communication asynchrone de la fonction de publication, ajax

Cible

ajax.gif

Environnement de développement

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

supposition

couler

1 Introduction de gem'jquery-rails ' 2 Modèle partiel pour la partie que vous souhaitez utiliser la communication asynchrone 3 télécommande: décrire vrai 4 Créez un fichier js.erb 5 Supprimer la destination de redirection du contrôleur

Si ça ne marche pas, ActionView :: Template :: Error est souvent affiché dans le terminal Je pense que la plupart des gens oublient de définir des variables. Après cela, si vous ne faites pas d'erreur dans le nom de l'ID et la description du rendu, cela devrait fonctionner.

Introduction de gem'jquery-rails '

Gemfile


gem 'jquery-rails'

Terminal


$ bundle install

app/assets/javascript/sapplication.js


//= require rails-ujs
//= require activestorage
//= require jquery      <--ajouter à
//= require turbolinks
//= require_tree .

Modèle partiel, distant: ajouter vrai

Cette fois, nous effectuerons une communication asynchrone sur le nouvel écran de publication,

erb:app/views/posts/new.html.erb


<h1>Posts#new</h1>
<span>Utilisateur actuellement connecté:<%= current_user.name %></span>

<--- form_pour former_Changer pour avec, data: {remote: true}Décris--->
<%= form_for(@post, url: posts_path) do |f| %>
<--- --->

	<div>
		<%= f.label :Titre%><br>
		<%= f.text_field :title, autofocus: true %> <--Ajouter un identifiant
	</div>
	<div>
		<%= f.label :Contenu%><br>
		<%= f.text_area :body %>
	</div>
	<div><%= f.submit "Publier" %></div>
<% end %>
<table>
	<thead>
		<tr>
			<th>Publié par nom</th>
			<th>Titre</th>
			<th>Texte</th>
			<th></th>
			<th></th>
			<th></th>
		</tr>
	</thead>
	<tbody>  <--Ajouter un identifiant

<---d'ici--->
		<% @posts.each do |post| %>
			<tr>
				<td><%= post.user.name %></td>
				<td><%= post.title %></td>
				<td><%= post.body %></td>
				<td><%= link_to "Détails", post_path(post) %></td>
				<td><%= link_to "Éditer", edit_post_path(post) %></td>
				<td><%= link_to "Effacer", post_path(post), method: :delete %></td>
			</tr>
		<% end %>
<---Modèle partiel jusqu'à ici--->

	</tbody>
</table>

La description modifiée est la suivante.

erb:app/views/posts/new.html.erb


<h1>Posts#new</h1>
<span>Utilisateur actuellement connecté:<%= current_user.name %></span>
<%= form_with model:[@post], data: {remote: true} do |f| %>
	<div>
		<%= f.label :Titre%><br>
		<%= f.text_field :title, autofocus: true, id: "text" %>
	</div>
	<div>
		<%= f.label :Contenu%><br>
		<%= f.text_area :body %>
	</div>
	<div><%= f.submit "Publier" %></div>
<% end %>
<table>
	<thead>
		<tr>
			<th>Publié par nom</th>
			<th>Titre</th>
			<th>Texte</th>
			<th></th>
			<th></th>
			<th></th>
		</tr>
	</thead>
	<tbody id="post">
		<%= render 'posts/new', posts: @posts %>
	</tbody>
</table>

<détails>

Supplément </ summary> render'posts / new ', messages: @posts Chargez le modèle partiel pour app / views / posts / _new.html.erb. Attribuez ensuite des @posts aux publications qui ont été modifiées en variables locales.

  • A ce moment, il est nécessaire de définir @posts dans create and destroy. Ceci sera décrit plus tard. </ détails>

Pour le modèle partiel, créez le fichier suivant et remplacez @posts par une variable locale. Ecrire à distance: vrai également dans le bouton de suppression

erb:app/views/posts/_new.html.erb


<% posts.each do |post| %>
	<tr>
		<td><%= post.user.name %></td>
		<td><%= post.title %></td>
		<td><%= post.body %></td>
		<td><%= link_to "Détails", post_path(post) %></td>
		<td><%= link_to "Éditer", edit_post_path(post) %></td>
		<td><%= link_to "Effacer", post_path(post), method: :delete, remote: true %></td>
	</tr>
<% end %>

Créer un fichier js.erb

js:app/views/create.js.erb


$('#post').html("<%= j(render 'posts/new', posts: @posts) %>");
$("text_area").val("");
$("#text").val("");

js:app/views/destroy.js.erb


$('#post').html("<%= j(render 'posts/new', posts: @posts) %>");

<détails>

Supplément </ summary> $ ('#post'). Html ("<% = j (render'posts / new ', posts: @posts)%>"); Cela signifie mettre à jour le html de la partie de rendu. $ ("Text_area"). Val (""); laisse text_area de form_with vide $ ("# Text"). Val (""); laisse text_fild (spécifié par id) de form_with vide Il est recommandé car vous pouvez utiliser append etc. en plus du HTML

# Supprimer la destination de redirection des contrôleurs

app/controllers/posts_controller.rb


  def create
    @posts = Post.all  <---ajouter à
    @post = Post.new(post_params)
    @post.user_id = current_user.id
    if @post.save
      redirect_to new_post_path  <---Effacer
    else
      render :new
    end
  end

  def destroy
    @posts = Post.all  <---ajouter à
    @post = Post.find(params[:id])
    @post.destroy
    redirect_to request.referer  <---Effacer
  end

Modifié.

app/controllers/posts_controller.rb


  def create
    @posts = Post.all
    @post = Post.new(post_params)
    @post.user_id = current_user.id
    if @post.save
    else
      render :new
    end
  end

  def destroy
    @posts = Post.all
    @post = Post.find(params[:id])
    @post.destroy
  end

Recommended Posts