我正在制作一个博客应用程序,当用户查看帖子索引视图时,我希望他们只编辑和删除他们创建的帖子。我收到以下错误:
nil的未定义方法`user_id':NilClass
视图/帖/ index.html中
<td><% if current_user.id == @post.user_id %></td>
<td><%= link_to 'Edit', edit_post_path(@post) %></td>
<td><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% end %>
以上是我的if语句,允许用户只编辑和删除他们创建的帖子。
在post_controller中创建方法:
def create
@post = Post.new(post_params)
@post.user = current_user
respond_to do |format|
if @post.save
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.json { render :show, status: :created, location: @post }
else
format.html { render :new }
form
at.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
答案 0 :(得分:2)
我为编辑,更新和销毁操作执行了一个前操作过滤器:
before_action :correct_user, only: [:edit, :update, :destroy]
def correct_user
@post = Post.find_by(id: params[:id]) // find the post
unless current_user?(@post.user)
redirect_to user_path(current_user)
end
end
current_user?(@post.user)
这会检查您在创建新帖子时定义的current_user和@ post.user是否相同。
在我的sessionHelper中,我需要定义当前用户的方法:
def current_user?(user)
user == current_user
end
def current_user
if(user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
end
end
在您的帖子视图中,您必须添加条件代码才能呈现编辑和删除链接,前提是用户是正确的:
<% if current_user?(post.user) %>
<%= link_to "Edit", edit_micropost_path(micropost) %>
<%= link_to "Delete", micropost, method: :delete, data: { confirm: "Do you want to delete this post ?"}%>
<% end %>
答案 1 :(得分:1)
您要确保if语句位于TD标记的一侧
<% if current_user && current_user.id == @post.user_id %>
<td></td>
<td><%= link_to 'Edit', edit_post_path(@post) %></td>
<td><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% end %>
#Post Controller
class Post < ApplicationController
...
def show
@post = Post.find(params[:id])
end
...
end