ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina
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.
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
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
...
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 %>
Durch Bearbeiten des Controllers und der Ansicht kann verhindert werden, dass andere Benutzer sie bearbeiten.
Recommended Posts