Определение способностей через полиморфные ассоциации в 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 я пытаюсь определить возможности для определенного пользовательского действия Responses через атрибуты в полиморфной ассоциации. Действие выглядит так:

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])
    undivided_millisecond_epoch_time_in_integer = params[:after]
    undivided_millisecond_epoch_time_in_decimal = (undivided_millisecond_epoch_time_in_integer).to_d
    divided_millisecond_epoch_time_in_decimal = (undivided_millisecond_epoch_time_in_decimal / 1000000).to_d
    @responses = @responseable.responses.where("created_at > ?", Time.at(divided_millisecond_epoch_time_in_decimal))
  end
...

Это действие запускается с помощью функции 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'

Есть идеи, как правильно определить эти типы способностей?


person Betjamin Richards    schedule 08.01.2013    source источник


Ответы (1)


Вы устроили настоящий беспорядок в этом контроллере, попробуйте следовать REST (или CRUD, если уж на то пошло).

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

load_resource :post
load_resource :call
load_resource :meeting
load_and_authorize_resource :response, :through => [:post, :call, :meeting]
person Community    schedule 08.01.2013
comment
Спасибо Эдуардо. Вы предлагаете мне перенести этот расчет в стандартное действие индекса или куда-то еще? - person Betjamin Richards; 09.01.2013
comment
Что касается вашего ответа, мне непонятно, как эти строки в контроллере разрешают возможность ответов. Когда я запускаю свой Ability_spec.rb, он по-прежнему показывает, что к ответам можно получить доступ, даже если их родитель содержит атрибут, который означает, что они не должны этого делать. Это отдельно от условий в файле Ability.rb? - person Betjamin Richards; 09.01.2013