Как установить значение таблицы в true, когда администратор нажимает отправить - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть система комментариев на моем сайте, и я хочу добавить подпись администратора к комментариям, сделанным администратором.Не все комментарии оставляются пользователями, так как комментарии создаются с помощью форума всеми, кто посещает сайт, даже обычными пользователями и администраторами.

Пользователь считается администратором, если значение 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]

, в то время как в модели User я установил соотношение has_many :comments, as: :commentable

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Ваша модель данных кажется мне неполной, вот что вы, возможно, захотите сделать:

  • Commentable может быть полиморфным отношением для моделей / сущностей, которое пользователь может комментировать.Таким образом, если пользователь может комментировать сообщение, оно может иметь 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
    
0 голосов
/ 27 сентября 2018

Мне просто интересно, можно ли сделать admin_comment автоматически, когда администратор делает комментарий вместо того, чтобы вообще использовать флажок.

Снимите флажок и установите before_createв модели комментариев и проверьте, является ли владелец комментария администратором.Например:

app/models/comment.rb

class Comment < AR
  belongs_to :user

  before_create do
    self.admin_comment = true if user.admin?
  end
end

BTW ваш код уязвим, любой может отправить параметр admin_comment со значением true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...