Определение способностей через атрибуты из полиморфной ассоциации в CanCan

У меня есть следующие модели:

class Post < ActiveRecord::Base
   has_many :responses, as: :responseable, dependent: :destroy
end

class Call < ActiveRecord::Base
   has_many :responses, as: :responseable, dependent: :destroy
end

class Meeting < ActiveRecord::Base
   has_many :responses, as: :responseable, dependent: :destroy
end

class Response < ActiveRecord::Base
   belongs_to :responseable, polymorphic: true # Tested
end

В CanCan я пытаюсь определить возможности для конкретного пользовательского действия «Ответы» через атрибуты в полиморфной ассоциации. Действие выглядит следующим образом:

class ResponsesController < ApplicationController

  before_filter :authenticate_user!
  load_and_authorize_resource

  respond_to :html, :xml, :js, :json, :pdf


  # GET /responses/polling
  # GET /responses/polling.json
  def polling
    responseable_type = params[:responseable_type]
    klass = [Post, Call, Meeting].detect { |c| responseable_type}
    @responseable = klass.find(params[:responseable_id])
    @responses = @responseable.responses.where("created_at > ?", Time.at(params[:after]))
  end
...

И мой файл способностей выглядит так:

...
can :polling, Response, :responseable_type = "Post", :responseable => { :user_expert_private => false, :countries => { :id => user.country_ids} }
...

Это действие выполняется с помощью функции javascript, которая опроса для новых ответов каждые 5 секунд. Однако, когда это выполняется, я получаю следующие ошибки в журнале:

A NameError occurred in responses#polling:

  uninitialized constant Responseable
  activesupport (3.2.8) lib/active_support/inflector/methods.rb:230:in `block in constantize'

Любая идея - правильный способ определения способностей по атрибутам из полиморфных отношений?

В принципе, я не хочу, чтобы пользователи могли просматривать/создавать ответ, если они не могут ? show: родительский объект.

2
nl ja de

1 ответы

Взгляните на статью wiki . Существует раздел о полиморфных типах. Вам нужно использовать вложенную авторизацию. Вот соответствующий раздел:

Предположим, что задачи могут быть назначены проекту или событию   через полиморфную ассоциацию. Массив можно передать в   : через опцию, и он будет использовать первый найденный.

load_resource :project
load_resource :event
load_and_authorize_resource :task, :through => [:project, :event]

Здесь он будет проверять как переменные @project, так и @event и выборку   задача через ту, которая существует. Обратите внимание, что это только загрузка   родительской модели, если вы хотите разрешить родителям, вам нужно будет   делайте это через файл before_filter, потому что есть специальная логика.

before_filter :authorize_parent
private
def authorize_parent
  authorize! :read, (@event || @project)
end
1
добавлено
pro.ruby
pro.ruby
1 181 участник(ов)

Язык программирования Ruby Additional docs: https://rubyreferences.github.io/rubyref/ Invite: https://telegram.me/joinchat/Be4rsT2NuB3CyJaF26j1kA Кто хочет компилировать: @crystal_ru (его синтаксис основан на Ruby) Участник @proDOT

Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
1 180 участник(ов)

https://telegram.me/rubyjob - Ruby Job По вопросам - @eugene_shved

Ruby School .us
Ruby School .us
1 045 участник(ов)

Чат-болталка для учеников руби-школы и не только. Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13

Random Ruby Chat
Random Ruby Chat
589 участник(ов)

Правила публикации вакансий: https://t.me/codenamecrud/60865

Rubyata
Rubyata
333 участник(ов)

Коммюнити Ruby и Ruby On Rails Флуд не приветствуются. Вакансии можно публиковать только и ТОЛЬКО по пятницам с хештегом #вакансия.

Ruby Talks
Ruby Talks
236 участник(ов)

Национальная Флеймотека

RubyRush
RubyRush
189 участник(ов)

rubyrush.ru программирование для самых новичков

Rails Chat
Rails Chat
87 участник(ов)

You are welcome to discuss Ruby On Rails development process and other stuff