WedX - журнал о программировании и компьютерных науках

Ассоциация пользователей Rails с комментариями

У меня есть скаффолд пользователя (DEVISE), эшафот комментариев и эшафот фильмов

В настоящее время комментарии размещены на странице кинопоказа.

У меня проблемы с созданием комментария пользователем. Так что комментарий создается пользователем.

Итак, если я покажу комментарий в movies/:show

я мог бы сделать

Тело: <%= comment.body %> Автор: <%= comment.user.first_name %>

Как мне сделать комментарий принадлежащим пользователю и доступным для редактирования и уничтожения только этим пользователем?

Пожалуйста, не говорите использовать before_filter :authenticate_user!, only: [:create,:destroy] или следовать Учебнику Майкла Хартла с микросообщениями, потому что я уже сделал и то, и другое, и они не работают.

В любом случае, кто-нибудь знает, как я могу это сделать?

Огромное спасибо


Ответы:


1

сначала я бы показал ссылку edit и destroy только владельцу с помощью:

<% if comment.user == current_user %>
  <%= link_to "edit", ... %>
  <%= link_to "delete", ... %>
<% end %>

а затем на всякий случай для умных парней, которые знают, как использовать элемент проверки в chrome, я бы сделал проверку уровня контроллера для владельца комментария:

def edit
  @comment = Comment.find(params[:id])
  if @comment.user == current_user
    @comment.update_attributes(....)
    @message = "Comment updated or created or deleted, depends on method"
  else
    @message = "It's not your comment wise guy :)"
  end
  redirect_to :back, notice: @message
end

то же самое для метода уничтожения и обновления.

!Не готовый к копированию/вставке код.

это то, что я сделал однажды, и это сработало довольно хорошо, вы можете использовать другой метод gem cancan https://github.com/ryanb/cancan и установить возможности для пользователей.

can :edit, Comment, :user_id => user.id
can :destroy, Comment, :user_id => user.id

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

12.06.2013
  • И update! В противном случае умный пользователь сможет редактировать этот пост. 12.06.2013
  • да, конечно, вы правы, для действий по обновлению вам также нужно будет проверить владельца. Спасибо, что упомянули об этом. 12.06.2013
  • ‹% if comment.user == current_user %› Это не работает, потому что все, что он делает, говорит, что комментарий доступен для редактирования, если есть current_user. Кроме того, мне пришлось изменить код, потому что тот, который вы предоставили, был скрыт для пользователей sign_in, где, как если бы я вышел из системы, я мог видеть действия. 12.06.2013
  • Если бы я использовал can :edit, Comment, :user_id => user.id Куда бы пошел этот код? 12.06.2013
  • может :edit перешел бы в модель способностей, для ее настройки требуется время, но в итоге работает отлично... о current_user, как вы сохраняете user_id в комментарии, разве вы не используете current_user или что-то вроде этого метода чтобы пользователи сохранялись в сеансе? railscasts.com/episodes/192-authorization-with-cancan 12.06.2013
  • Как указано в вопросе, я использую Devise. Я только что создал комментарий, и когда я нажимаю, чтобы отредактировать этот комментарий, я получаю «Это не ваш комментарий, умник» :) 12.06.2013
  • так почему вы говорите, что <% if comment.user == current_user %> не будет работать, на этом этапе вы просто скрываете ссылки от других, показывая их только владельцу, а в контроллере вы можете снова фильтровать пользователя, если current_user не существует, его не будет редактируемый и даже доступный 12.06.2013
  • давайте продолжим обсуждение в чате 12.06.2013

  • 2

    как насчет помощника по разработке 'current_user'? что-то вроде этого:

    class Comment < ActiveRecord::Base
      belongs_to :user
    end
    
    class CommentsController < ApplicationController
      def edit
        comment = current_user.comments.where(id: params[:id]).first
        if comment.nil?
          ...
          401 error or something else (current user is not creator of this comment)
        else
         ...
        end
       end
    end
    

    А также вы можете проверить разрешения в представлении:

    <% if comment.user == current_user %>
      <%= link_to "edit comment" ... %>
      <%= link_to "delete comment" ... %>
    <% end %>
    
    12.06.2013

    3

    Чтобы комментарий принадлежал пользователю, в действии create:

    comment = current_user.comments.new(params[:comment])
    

    Сделать его редактируемым/удаляемым только для владельца

    before_filter :find_comment, only: [:show, :edit, :update, :destroy]
    before_filter :authorize_user!, only: [:edit, :update, :destroy]
    #...
    
    private
    
      def find_comment
        @comment = Comment.find params[:id]
      end
    
      def authorize_user!
        deny_access if @comment.user != current_user # example
      end
    
    12.06.2013

    4

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

    Devise дает вам current_user. Итак, если ваши Comment belongs_to :user и ваши User has_many :comments напишите в своем CommentsController:

    def new
      @comment= current_user.comments.new
    end
    
    def create
      @comment= current_user.comments.new(params[:comment])
      if @comment.save
        ...
      end
    end
    
    def edit
      @comment= current_user.comments.find(params[:id])
    end
    
    def update
      @comment= current_user.comments.find(params[:id])
      if @comment.update_attributes(params[:comment])
        ...
      end
    end
    
    12.06.2013
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]