私のコメントモデルは非常にシンプルでポリモーフィックに機能しますが、これらのポリモーフィックな関連付け全体で、特定のレコードの作成者によるコメントを非表示にする機能を追加しています。
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
したがって、モデルが1つしかない場合は、作成者(@ 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" %>