hackvan said over 7 years ago on Polymorphic Associations :

Excellent episode, very useful.


Wolfgang Barth PRO said about 7 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
  ...  endend
module Wobauth
  class AuthoritiesController < ApplicationController
   ...
  end
end

I get the following error:

uninitialized constant AuthorityExtracted 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 about 7 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 about 7 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