Проблема с авторизацией на основе ролей в ассоциативной таблице ссылок - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть одна таблица собственных ссылок для раздела вопросов и ответов о продукте, названная question_and_answers со столбцами: id, parent_id, text_field, user_id и product_id. Вопрос не имеет parent_id, а ответы имеют parent_id вопроса. У пользователя две роли: поставщик и клиент.

Как мне кодировать действие создания для вопроса и ответа в одном действии контроллера, если пользователь с ролью клиента может создать вопрос с nil parent_id, а пользователь с ролью поставщика может создать ответ с parent_id идентификатора вопроса. Я застрял на том, как разрешить клиентам создавать только вопросы, а поставщикам - только ответы. Я использую CanCan для авторизации на основе ролей.

Моя ассоциация такая:

QuestionAndAnswer
belongs_to product, belongs_to user
has_many parent, class_name: QuestionAndAnswer, foreign_key: parent_id

User
has_many question_and_answers

Product 
has_many question_and_answers

Мой контроллер такой вот сейчас

class QuestionAndAnswersController < Api::BaseController
def create
   @thread = QuestionAndAnswer.new(thread_params)
   if @thread.save
     render json: @thread, status: :created
   else
     render status: 422 , json: {
     success: false,
     message: "Couldn't create thread"
   }
   end
end

def permitted_params
   [:parent_id, :textfield, :product_id, :user_id]
end

def thread_params
   params.permit(permitted_params)        
end
end

Должен ли я что-то добавить в моем действии контроллера ?? Я сейчас пустой

1 Ответ

1 голос
/ 09 февраля 2020

Один из способов сделать это - создать метод проверки правильности параметров в соответствии с ролью пользователя,

def valid_params?
  has_parent = permitted_params[:parent_id].present?

  return false if current_user.vendor? && !has_parent
  return false if current_user.customer? && has_parent

  return true
end

Затем использовать это в create action

def create
   @thread = QuestionAndAnswer.new(thread_params)

   if valid_params? && @thread.save
     ...
   else
     ...
   end
end

Конечно, вам нужно заменить current_user.vendor? или current_user.customer? эквивалентным методом проверки, предоставленным канканом.

Надеюсь, что ответ на ваш вопрос!

...