我的网站上有一个评论系统,想在管理员的评论中添加管理员签名。并非所有评论都由用户留下,因为访问该网站的任何人,甚至是普通用户和管理员用户都可以通过论坛来发表评论。
如果users表上的admin
布尔值是true
,则认为用户是管理员。
Comment.rb
class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
has_many :comments, as: :commentable, dependent: :destroy
default_scope {order(created_at: :asc)}
attribute :nickname, :captcha => true
validates :body, presence: true, length: { minimum: 3, maximum: 300 }
validates :name, presence: true, length: { minimum: 2, maximum: 30 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 100 },
format: { with: VALID_EMAIL_REGEX }
end
comments_controller.rb
class CommentsController < ApplicationController
before_action :find_commentable
private
def comment_params
params.require(:comment).permit(:body, :email, :name, :admin_comment)
end
def find_commentable
@commentable = Comment.find_by_id(params[:comment_id]) if params[:comment_id]
@commentable = Post.friendly.find(params[:post_id]) if params[:post_id]
end
end
如何在帖子上留下评论 :(另一种形式是使用<%= simple_form_for([comment, Comment.new]) do |f| %>
来回复评论。)
<%= simple_form_for([@post, Comment.new]) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.input :body, :as => :text, input_html: { maxlength: 300 }, label: false, placeholder: "What are your thoughts?", class: "form-control", wrapper_html: { id: 'contactTextarea' } %>
<%= f.input :name, label: false, placeholder: "Name (required) - Just your first name is okay too!", class: "form-control" %>
<%= f.input :email, label: false, placeholder: "Email Address (required) - This is not displayed with the comment", class: "form-control" %>
<div class="form-group hidden">
<%= f.input :nickname, :hint => "leave this field blank!", class: "form-control" %>
</div>
<%= f.submit "Post Comment", class: "btn btn-success" %>
<% end %>
我尝试过的操作(在find_commentable
方法中):
@commentable = User.find_by_id(params[:user_id]) if params[:user_id]
和
@commentable = User.friendly.find(params[:user_id]) if params[:user_id]
在用户模型中,我建立了has_many :comments, as: :commentable
答案 0 :(得分:1)
我只是想知道admin_comment是否可以设为true 当管理员发表评论而不需要使用时自动 一个复选框。
删除复选框并在评论模型中设置before_create
,然后检查评论的所有者是否为admin。例如:
app/models/comment.rb
class Comment < AR
belongs_to :user
before_create do
self.admin_comment = true if user.admin?
end
end
顺便说一句,您的代码容易受到攻击,任何人都可以发送具有admin_comment
值的true
参数。
答案 1 :(得分:1)
您的数据模型对我来说似乎不完整,这是您可能想要做的事情:
has_many :comments, as: :commentable
。同样,如果用户可以回复其他人的评论,则评论模型也可以具有这种多态关系。has_many :comments
关系相关。您不能在此处使用多态,因为这意味着您试图在用户上添加评论,而不是跟踪哪个用户在帖子上添加了特定评论或回复了任何评论。如果您不想跟踪发表评论的用户,而只想跟踪评论是否是管理员,则可以将控制器中的代码修改为:
def comment_params
params.require(:comment).permit(:body, :email, :name).merge(admin_comment: current_user.admin)
end