当管理员按下提交时如何将表值设置为true

时间:2018-09-27 18:59:50

标签: ruby-on-rails ruby

我的网站上有一个评论系统,想在管理员的评论中添加管理员签名。并非所有评论都由用户留下,因为访问该网站的任何人,甚至是普通用户和管理员用户都可以通过论坛来发表评论。

如果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

的关系

2 个答案:

答案 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)

您的数据模型对我来说似乎不完整,这是您可能想要做的事情:

  • 可注释性可以是用户可以对其进行评论的模型/实体的多态关系。因此,如果用户可以在Post上发表评论,那么它可以具有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