如何:作为协会工作?

时间:2012-11-28 16:58:52

标签: ruby-on-rails polymorphism metaprogramming

我的评论模型非常简单并且具有多态性,但我现在正在添加隐藏这些多态关联中给定记录的作者的评论的能力。

class Comment < ActiveRecord::Base
  attr_accessible :content, :show
  belongs_to :commentable, :polymorphic => true
  belongs_to :user
end

所以,请求,问题,帖子,提交等...都有评论并且正在访问评论模板而没有问题,但我想允许这些模型中的内容的作者显示或隐藏评论(而不是例如,当应用程序将它们标识为正在评论的内容的作者时标记。

class Request < ActiveRecord::Base
   has_many :comments, :as => :commentable, :dependent => :destroy
end

所以,当只有一个模型时,通过调用作者:@ request.user,我可以正常工作 但我想知道如何使用元编程调用作者,因此注释视图(有帮助)可以确定当前使用注释视图的模型。

我已经对元编程做了一些研究,但还没找到答案。

以下是调用作者的代码(@ request.user):

    <% if @comments %>
        <h1 class="mtop20">Comments</h1>
        <% for comment in @comments %>
           <% if signed_in? %>
                <% if comment.show == true %>
                   <div class="well comment mtop10">
                        <% if current_user == @request.user or current_user.has_role? :admin %>
                             <%= simple_form_for [@commentable, comment] do |f| %>
                              <div class ="">
                                <%= f.input :show, :as => :hidden, :input_html => { :value => false }  %>
                                <%= f.submit "Hide Comment", :class => 'btn btn-mini pull-right' %>
                              </div>
                            <% end %>
                        <% end %>
                        <span>
                           <%= image_tag comment.user.image.source(:header) %>
                           <%= link_to comment.user.name, comment.user %></span>
                           Posted <%= time_ago_in_words(comment.created_at) %> ago
                        </span>
                        <p class="mleft20 mtop10"><%= comment.content %></p>
                        <% if signed_in? %>
                            <% if current_user.id == comment.user_id or current_user.has_role? :admin %>
                                <%= link_to 'Edit', polymorphic_path([ comment.commentable, comment], :action => :edit), 
                                                    :class => 'btn btn-mini mtop5 mleft10' %>
                                <%= link_to 'Delete', [comment.commentable, comment],
                                                    :confirm => 'Are you sure?',
                                                    method: :delete, 
                                                    :class => 'btn btn-mini mtop5' %>
                            <% end %>
                        <% end %>
                   </div>
               <% end %>
               <% if comment.show == false %>
                  <p>A comment by <%= comment.user.name %> has been hidden by <%= @request.user.name %></p>
                  <% if current_user == @request.user or current_user.has_role? :admin %>
                     <%= simple_form_for [@commentable, comment] do |f| %>
                      <div class ="">
                        <%= f.input :show, :as => :hidden, :input_html => { :value => true }  %>
                        <%= f.submit "Show Comment", :class => 'btn btn-mini btn-success' %>
                      </div>
                    <% end %>
                  <% end %>
               <% end %>
          <% end %>
       <% end %>
    <% end %>
    <%= render "comments/form" %>

1 个答案:

答案 0 :(得分:1)

使用comment.commentable.user访问您帖子的作者。