ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina
Fondamentalement, ① Utilisez l'instruction if pour affiner par current_user, etc. ② S'il faut extraire le modèle associé à current_user Seul l'utilisateur qui a publié peut le modifier.
Description à l'état supposé
app/controllers/posts_controller.rb
	def edit
		@post = Post.find(params[:id])
	end
	def update
    @post = Post.find(params[:id])
		if @post.update(post_params)
      redirect_to new_post_path
    else
      render :edit
    end
	end
	def destroy
		@posts = Post.all
		@post = Post.find(params[:id])
		@post.destroy
	end
Si vous cliquez sur l'URL telle quelle, vous pouvez la modifier et la supprimer. Par conséquent, écrivez comme suit.
app/controllers/posts_controller.rb
  def edit
    @post = Post.find(params[:id])
    unless @post.user == current_user
      redirect_to  new_post_path
    end
  end
  def update
    @post = Post.find(params[:id])
    if @post.user != current_user
      redirect_to  new_post_path
    else
      if @post.update(post_params)
        redirect_to new_post_path
      else
        render :edit
      end
    end
  end
  def destroy
    @posts = Post.all
    @post = Post.find(params[:id])
    if @post.user != current_user
      redirect_to  new_post_path
    else
      @post.destroy
    end
  end
<détails> 
Cependant, cela nécessite beaucoup de description et sa correction prend du temps. Utilisez donc before_action.
app/controllers/posts_controller.rb
before_action :ensure_user, only: [:edit, :update, :destroy]
...
	
  def edit
  end
  def update
    if @post.update(post_params)
      redirect_to new_post_path
    else
      render :edit
    end
  end
  def destroy
    @post.destroy
    redirect_to new_post_path
  end
  private
  def ensure_user
    @posts = current_user.posts
    @post = @posts.find_by(id: params[:id])
    redirect_to new_post_path unless @post
  end
...
<détails> 
Il est souhaitable de ne pas afficher à l'écran avant que l'URL ne soit solidifiée pour éviter toute erreur d'identification de l'utilisateur.
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 %></td>
	</tr>
<% end %>
Corrigez cette partie.
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>
    <% if post.user == current_user %>
      <td><%= link_to "Éditer", edit_post_path(post) %></td>
      <td><%= link_to "Effacer", post_path(post), method: :delete %></td>
    <% else %>
      <td></td>
      <td></td>
    <% end %>
  </tr>
<% end %>
En éditant le contrôleur et la vue, il est possible d'empêcher l'édition par d'autres utilisateurs.
Recommended Posts