0

我有一个 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#editposts#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 %>不是那种有条件的混乱来使用他的帖子列表呈现我的用户个人资料时,它只会返回以下错误:

错误

我究竟做错了什么?

4

1 回答 1

2

您可能同时想到了这一点,但这是其他人的答案:您正在调用@post = ....decorate您的控制器,但您正在使用@user.posts.each { |post| ... }您的视图。馈送到该块的对象没有被装饰。只是@post

在您看来,您应该做类似的事情@user.posts.each { |raw_post| post = raw_post.decorate }。显然,使用 ERB 语法。或者@user.decorated_posts.each ...在哪里

class User < ActiveRecord::Base
  ...
  def decorated_posts
    # this will load every post associated with the user.
    # if there are a lot of them you might want to only load a limited scope of them
    posts.map(&:decorate)
  end
  ...
end
于 2017-03-10T20:58:30.350 回答