rails-erb-loader icon indicating copy to clipboard operation
rails-erb-loader copied to clipboard

How to access controller methods in erb file?

Open chipit24 opened this issue 2 years ago • 4 comments

I have a controller at lib/my_awesome_helpers/controller.rb that looks something like this:

module MyAwesomeHelpers
  module Controller
    def print_some_stuff
      return 'some stuff'
    end
  end
end

I set up my webpack.config.js file with the following options:

  /* ... */
  module: {
    rules: [
      {
        test: /\.js\.erb$/,
        enforce: 'pre',
        loader: 'rails-erb-loader',
      },
      /* ... */

And here is my frontend/lib/testing.js.erb file:

console.log(<%= not Rails.env.production? %>); // this works fine, logs false
console.log('<%= MyAwesomeHelpers::Controller.print_some_stuff %>'); // this causes an error

My setup works great, however, when I try to access any of my controller methods, I get the following error when I run my webpack build:

Traceback (most recent call last):
  13: from ./bin/rails:4:in `<main>'
  12: from ./bin/rails:4:in `require'
  11: from /Users/[...]/.rvm/gems/ruby-2.7.6@my_awesome_project/gems/railties-6.1.5.1/lib/rails/commands.rb:18:in `<top (required)>'
  10: from /Users/[...]/.rvm/gems/ruby-2.7.6@my_awesome_project/gems/railties-6.1.5.1/lib/rails/command.rb:48:in `invoke'
  9: from /Users/[...]/.rvm/gems/ruby-2.7.6@my_awesome_project/gems/railties-6.1.5.1/lib/rails/command/base.rb:69:in `perform'
  8: from /Users/[...]/.rvm/gems/ruby-2.7.6@my_awesome_project/gems/thor-1.2.1/lib/thor.rb:392:in `dispatch'
  7: from /Users/[...]/.rvm/gems/ruby-2.7.6@my_awesome_project/gems/thor-1.2.1/lib/thor/invocation.rb:127:in `invoke_command'
  6: from /Users/[...]/.rvm/gems/ruby-2.7.6@my_awesome_project/gems/thor-1.2.1/lib/thor/command.rb:27:in `run'
  5: from /Users/[...]/.rvm/gems/ruby-2.7.6@my_awesome_project/gems/railties-6.1.5.1/lib/rails/commands/runner/runner_command.rb:42:in `perform'

ERROR in ./lib/testing.js.erb
Module build failed (from ../node_modules/rails-erb-loader/index.js):
Error: rails-erb-loader failed with code: 1
    at ChildProcess.<anonymous> (/Users/[...]/Code/my_awesome_project/node_modules/rails-erb-loader/index.js:128:16)
    at ChildProcess.emit (events.js:198:13)
    at maybeClose (internal/child_process.js:982:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:259:5)

Any idea on how to get this working?

chipit24 avatar May 30 '22 14:05 chipit24

Hm, my Ruby is rusty...

module MyAwesomeHelpers
  module Controller # I don't know what this line does

  def print_some_stuff
    return 'some stuff'
  end
end

Should this not be:

module MyAwesomeHelpers
  module Controller

    def Controller.print_some_stuff
      return 'some stuff'
    end
  end
end

rhys-vdw avatar May 31 '22 00:05 rhys-vdw

Ya but normally we use self.method not Modulename.method

module MyAwesomeHelpers
  module Controller

    def self.print_some_stuff
      # Do you need `return`?
      return 'some stuff'
    end
    # or
    # Not sure if this works in module (that's is not a class)
    class << self
      def print_some_stuff
        # Do you need `return`?
        return 'some stuff'
      end
    end
  end
end

PikachuEXE avatar May 31 '22 01:05 PikachuEXE

@rhys-vdw The controller is set up correctly, I redacted the details of the controller and made a mistake with the nesting when writing it here, thanks for catching that! But my Ruby is very rust right now as well 😅

@PikachuEXE I can give that a try, thanks!

One thing to note about this controller is that its methods are used in a "regular" view file at app/views/layouts without issue–so I don't think there's anything really wrong with the controller itself. I'm only having issues accessing those helper methods in my .js.erb file using rails-erb-loader.

chipit24 avatar May 31 '22 02:05 chipit24

Well controller instances are only created in response to a request, so they won't exist at build time. This is why I was trying to make sense of your code example. Anything that is global should be available to rails-erb-loader. An easy way to test if this is true is to open up the Rails REPL and see if your Ruby works. If your code works there then it should work in the template.

rhys-vdw avatar May 31 '22 02:05 rhys-vdw