我有一个 User 和 Post 模型,它们以经典的方式相互关联——User has_many :posts
并且Post belongs_to :user
. 在users#show
我显示用户个人资料的地方,我还列出了他发布的所有帖子。另外,我希望有链接来恭敬地编辑和删除每个帖子。所以,我弥补了这一点:
<% @user.posts.each do |post| %>
<h1><%= link_to post.title, post_path(post) %></h1>
<% if @user == current_user %>
<%= link_to 'Edit', edit_post_path(post) %>
<%= link_to 'Delete', post_path(post), method: :delete %>
<% end %>
<% end %>
但是,将这个逻辑放到视图中肯定会导致混乱,所以我决定使用 Draper 并为此编写装饰器。当我们要检查权限posts#edit
和posts#delete
方法时,我想出了一个 Post 模型的装饰器,并尝试在PostsController
. 它是这样的:
class PostDecorator << Draper::Decorator
delegate_all
def link_to_edit
if object.user == current_user
h.link_to 'Edit', h.edit_post_path(object)
end
end
def link_to_delete
if object.user == current.user
h.link_to 'Delete', h.post_path(object), method: :delete
end
end
end
然后,在我的PostsController
:
# ... class definition
before_action :set_post, only: [:show, :edit, :update, :destroy]
# ... other controller methods
def edit; end
def update
if @post.update(post_params)
@post.save
redirect_to post_path(@post)
else
render 'edit'
end
end
def destroy
@post.destroy
redirect_to feed_path
end
private
# Using FriendlyId gem to have neat slugs
def set_post
@post = Post.friendly.find(params[:id]).decorate
end
但是每次我尝试使用我的新助手<%= post.link_to_delete %>
而<%= post.link_to_edit %>
不是那种有条件的混乱来使用他的帖子列表呈现我的用户个人资料时,它只会返回以下错误:
我究竟做错了什么?