hackvan said over 6 years ago on Polymorphic Associations :

Excellent episode, very useful.


Wolfgang Barth PRO said over 6 years ago on Polymorphic Associations :

I like it, routing via :modules is very elegant. It works for me in a normal rails application, but i can't get it work inside of a rails engine.

config/routes.rb from the engine:

Wobauth::Engine.routes.draw do
  resources :users do
    resources :authorities, module: :users
  end
end

Controllers:

module Wobauth
  class Users::AuthoritiesController < AuthoritiesController ...
  end
end
module Wobauth
  class AuthoritiesController < ApplicationController
   ...
  end
end

I get the following error:

uninitialized constant Authority
Extracted source (around line #269):
      names.inject(Object) do |constant, name|
        if constant == Object
          constant.const_get(name)
        else
          candidate = constant.const_get(name)
          next candidate if constant.const_defined?(name, false)

It works without specifying :modules, but this means i must place the logic in the main authorities_controller ... so its less elegant. Any idea?

Wolfgang.


David Kimura PRO said over 6 years ago on Polymorphic Associations :

My guess would be when the type is saved to the database, it is being saved as Authority instead of Wobauth::Authority. Try adding a class_name to the association to see if that makes a difference. The users might be wobauth_users depending where it is declared.

has_many :users, class_name: 'Wobauth::Authority'

Wolfgang Barth PRO said over 6 years ago on Polymorphic Associations :

Yeah, found it. The problem comes from cancancan/lib/cancan/controller_resource.rb in 


    def resource_class
      case @options[:class]
      when false
        name.to_sym
      when nil
        namespaced_name.to_s.camelize.constantize
      when String
        @options[:class].constantize
      else
        @options[:class]
      end
    end

The error cames from namespaced_name.to_s.camelize.constantize, which resolves to "Authority". I now set

module Wobauth
  class AuthoritiesController < ApplicationController
    skip_load_and_authorize_resource
    load_and_authorize_resource class: Wobauth::Authority ...

This sets the class name manually. Seems to work now. Thank you for the idea ;-)


Login to Comment