[Ruby on Rails] Nur den Benutzer, der Beiträge verfasst hat, dürfen bearbeiten

Ziel

Entwicklungsumgebung

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

Annahme

Denkweise

Grundsätzlich, ① Verwenden Sie die if-Anweisung, um nach current_user usw. einzugrenzen. ② Gibt an, ob das mit current_user verknüpfte Modell extrahiert werden soll Nur der Benutzer, der gepostet hat, kann es bearbeiten.

Controller bearbeiten

Beschreibung im angenommenen Zustand

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

Wenn Sie die URL so wie sie ist drücken, können Sie sie bearbeiten und löschen. Schreiben Sie daher wie folgt.

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
Supplement es sei denn Bedingung => Definieren Sie den Fall, in dem die Bedingung falsch ist.

Dies erfordert jedoch viel Beschreibung und es braucht Zeit, um es zu korrigieren. Verwenden Sie also 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

...

Supplement Durch die Verwendung von before_action kann die Aktion angegeben werden, die ausgeführt werden soll, bevor die Aktion geladen wird. Die Definition erfolgt mit dem Parameter strong, und wenn es sich nicht um current_user handelt, wird reeditrct_to definiert.

Ansichten bearbeiten

Es ist wünschenswert, nicht auf dem Bildschirm anzuzeigen, bevor die URL verfestigt ist, um eine falsche Identifizierung des Benutzers zu verhindern.

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 "Einzelheiten", post_path(post) %></td>
		<td><%= link_to "Bearbeiten", edit_post_path(post) %></td>
		<td><%= link_to "Löschen", post_path(post), method: :delete %></td>
	</tr>
<% end %>

Korrigieren Sie diesen Teil.

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 "Einzelheiten", post_path(post) %></td>
    <% if post.user == current_user %>
      <td><%= link_to "Bearbeiten", edit_post_path(post) %></td>
      <td><%= link_to "Löschen", post_path(post), method: :delete %></td>
    <% else %>
      <td></td>
      <td></td>
    <% end %>
  </tr>
<% end %>

Fazit

Durch Bearbeiten des Controllers und der Ansicht kann verhindert werden, dass andere Benutzer sie bearbeiten.

Recommended Posts