Skip to content

Using mounted method within params #2321

Closed
@Nix41

Description

@Nix41

When constructing a namespace, where options are passed through the configuration hash
In order to declare the params using the entity set in the configuration, as per the documentation:

params do
  requires :all, using: mounted { configuration[:entity] }.documentation
end
post do
  resource = configuration[:model].create!(
  present resource, with: mounted { configuration[:entity] }
end

Results in:

NoMethodError:
  undefined method `mounted' for #<Grape::Validations::ParamsScope:0x00007f1a325c2df0 @element=nil, @element_renamed=nil, @parent=nil, @api=#<Class:0x00007f1a325cc508>, @optional=false, @type=Hash, @group=nil, @dependent_on=nil, @declared_params=[], @index=nil>

The mounted method, does seem to be accessible via the @api variable within Grape::Validations::ParamsScope
Maybe I am missing something?

In any case, thanks in advance for taking a look

Here the full backtrace or the Error:
# ./app/api/admin_dashboard/resources/templates/crud.rb:21:in `block (2 levels) in <class:Crud>'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/validations/params_scope.rb:70:in `instance_eval'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/validations/params_scope.rb:70:in `initialize'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/dsl/validations.rb:39:in `new'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/dsl/validations.rb:39:in `params'
# ./app/api/admin_dashboard/resources/templates/crud.rb:20:in `block in <class:Crud>'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api/instance.rb:118:in `instance_eval'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api/instance.rb:118:in `block in evaluate_as_instance_with_configuration'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/util/lazy_block.rb:11:in `evaluate_from'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api/instance.rb:125:in `evaluate_as_instance_with_configuration'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api/instance.rb:107:in `block in nest'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api/instance.rb:107:in `each'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api/instance.rb:107:in `nest'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/dsl/routing.rb:175:in `block in namespace'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/dsl/settings.rb:160:in `within_namespace'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/dsl/routing.rb:172:in `namespace'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api.rb:160:in `replay_step_on'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api.rb:151:in `block in add_setup'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api.rb:150:in `each'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api.rb:150:in `add_setup'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api.rb:55:in `block (2 levels) in override_all_methods!'
# ./app/api/admin_dashboard/resources/templates/crud.rb:10:in `<class:Crud>'
# ./app/api/admin_dashboard/resources/templates/crud.rb:6:in `<module:Templates>'
# ./app/api/admin_dashboard/resources/templates/crud.rb:5:in `<module:Resources>'
# ./app/api/admin_dashboard/resources/templates/crud.rb:4:in `<module:AdminDashboard>'
# ./app/api/admin_dashboard/resources/templates/crud.rb:3:in `<top (required)>'
# /usr/share/rvm/gems/ruby-3.1.3/gems/zeitwerk-2.6.8/lib/zeitwerk/kernel.rb:30:in `require'
# /usr/share/rvm/gems/ruby-3.1.3/gems/zeitwerk-2.6.8/lib/zeitwerk/kernel.rb:30:in `require'
# ./app/api/admin_dashboard/resources/admins.rb:7:in `block in <class:Admins>'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api/instance.rb:118:in `instance_eval'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api/instance.rb:118:in `block in evaluate_as_instance_with_configuration'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/util/lazy_block.rb:11:in `evaluate_from'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api/instance.rb:125:in `evaluate_as_instance_with_configuration'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api/instance.rb:107:in `block in nest'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api/instance.rb:107:in `each'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api/instance.rb:107:in `nest'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/dsl/routing.rb:175:in `block in namespace'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/dsl/settings.rb:160:in `within_namespace'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/dsl/routing.rb:172:in `namespace'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api.rb:160:in `replay_step_on'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api.rb:151:in `block in add_setup'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api.rb:150:in `each'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api.rb:150:in `add_setup'
# /usr/share/rvm/gems/ruby-3.1.3/gems/grape-1.7.0/lib/grape/api.rb:55:in `block (2 levels) in override_all_methods!'
# ./app/api/admin_dashboard/resources/admins.rb:6:in `<class:Admins>'
# ./app/api/admin_dashboard/resources/admins.rb:5:in `<module:Resources>'
# ./app/api/admin_dashboard/resources/admins.rb:4:in `<module:AdminDashboard>'
# ./app/api/admin_dashboard/resources/admins.rb:3:in `<top (required)>'
# /usr/share/rvm/gems/ruby-3.1.3/gems/zeitwerk-2.6.8/lib/zeitwerk/kernel.rb:30:in `require'
# /usr/share/rvm/gems/ruby-3.1.3/gems/zeitwerk-2.6.8/lib/zeitwerk/kernel.rb:30:in `require'
# ./app/api/admin_dashboard/base.rb:19:in `<class:Base>'
# ./app/api/admin_dashboard/base.rb:4:in `<module:AdminDashboard>'
# ./app/api/admin_dashboard/base.rb:3:in `<top (required)>'
# /usr/share/rvm/gems/ruby-3.1.3/gems/zeitwerk-2.6.8/lib/zeitwerk/kernel.rb:30:in `require'
# /usr/share/rvm/gems/ruby-3.1.3/gems/zeitwerk-2.6.8/lib/zeitwerk/kernel.rb:30:in `require'
# ./app/api/api.rb:59:in `<class:Api>'
# ./app/api/api.rb:5:in `<module:Api>'
# ./app/api/api.rb:4:in `<top (required)>'
# /usr/share/rvm/gems/ruby-3.1.3/gems/zeitwerk-2.6.8/lib/zeitwerk/kernel.rb:30:in `require'
# /usr/share/rvm/gems/ruby-3.1.3/gems/zeitwerk-2.6.8/lib/zeitwerk/kernel.rb:30:in `require'
# ./config/routes.rb:812:in `block in <top (required)>'
# /usr/share/rvm/gems/ruby-3.1.3/gems/actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:428:in `instance_exec'
# /usr/share/rvm/gems/ruby-3.1.3/gems/actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:428:in `eval_block'
# /usr/share/rvm/gems/ruby-3.1.3/gems/actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:410:in `draw'
# ./config/routes.rb:7:in `<top (required)>'
# /usr/share/rvm/gems/ruby-3.1.3/gems/railties-7.0.4.3/lib/rails/application/routes_reloader.rb:50:in `load'
# /usr/share/rvm/gems/ruby-3.1.3/gems/railties-7.0.4.3/lib/rails/application/routes_reloader.rb:50:in `block in load_paths'
# /usr/share/rvm/gems/ruby-3.1.3/gems/railties-7.0.4.3/lib/rails/application/routes_reloader.rb:50:in `each'
# /usr/share/rvm/gems/ruby-3.1.3/gems/railties-7.0.4.3/lib/rails/application/routes_reloader.rb:50:in `load_paths'
# /usr/share/rvm/gems/ruby-3.1.3/gems/railties-7.0.4.3/lib/rails/application/routes_reloader.rb:24:in `reload!'
# /usr/share/rvm/gems/ruby-3.1.3/gems/railties-7.0.4.3/lib/rails/application.rb:149:in `reload_routes!'
# /usr/share/rvm/gems/ruby-3.1.3/gems/devise-4.9.2/lib/devise/rails.rb:17:in `block in <class:Engine>'
# /usr/share/rvm/gems/ruby-3.1.3/gems/activesupport-7.0.4.3/lib/active_support/lazy_load_hooks.rb:92:in `block in execute_hook'
# /usr/share/rvm/gems/ruby-3.1.3/gems/activesupport-7.0.4.3/lib/active_support/lazy_load_hooks.rb:85:in `with_execution_control'
# /usr/share/rvm/gems/ruby-3.1.3/gems/activesupport-7.0.4.3/lib/active_support/lazy_load_hooks.rb:90:in `execute_hook'
# /usr/share/rvm/gems/ruby-3.1.3/gems/activesupport-7.0.4.3/lib/active_support/lazy_load_hooks.rb:76:in `block in run_load_hooks'
# /usr/share/rvm/gems/ruby-3.1.3/gems/activesupport-7.0.4.3/lib/active_support/lazy_load_hooks.rb:75:in `each'
# /usr/share/rvm/gems/ruby-3.1.3/gems/activesupport-7.0.4.3/lib/active_support/lazy_load_hooks.rb:75:in `run_load_hooks'
# /usr/share/rvm/gems/ruby-3.1.3/gems/railties-7.0.4.3/lib/rails/application/finisher.rb:73:in `block in <module:Finisher>'
# /usr/share/rvm/gems/ruby-3.1.3/gems/railties-7.0.4.3/lib/rails/initializable.rb:32:in `instance_exec'
# /usr/share/rvm/gems/ruby-3.1.3/gems/railties-7.0.4.3/lib/rails/initializable.rb:32:in `run'
# /usr/share/rvm/gems/ruby-3.1.3/gems/railties-7.0.4.3/lib/rails/initializable.rb:61:in `block in run_initializers'
# /usr/share/rvm/gems/ruby-3.1.3/gems/railties-7.0.4.3/lib/rails/initializable.rb:60:in `run_initializers'
# /usr/share/rvm/gems/ruby-3.1.3/gems/railties-7.0.4.3/lib/rails/application.rb:372:in `initialize!'
# ./config/environment.rb:5:in `<top (required)>'
# ./spec/rails_helper.rb:6:in `require'
# ./spec/rails_helper.rb:6:in `<top (required)>'
Here the rest of the relevant code
# frozen_string_literal: true

module AdminDashboard
  module Resources
    class Admins < Base
      resource :admins do
        mount Resources::Templates::Crud, with: { index: Admin.all, entity: Entities::Admin }
      end
    end
  end
end
# frozen_string_literal: true

module AdminDashboard
  module Resources
    module Templates
      class Crud < Base
        include Grape::Kaminari

        namespace do
          params do
            use :pagination, per_page: 10, max_per_page: 30
          end
          get do
            list = configuration[:index]

            present paginate(list), with: mounted { configuration[:entity] }
          end

          params do
            requires :all, using: mounted { configuration[:entity] }.documentation
          end
          post do
            resource = configuration[:model].create!(permitted_params)

            present resource, with: mounted { configuration[:entity] }
          end
        end
      end
    end
  end
end

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions