Trouble developing Rails plugins/gems with generators

Hi,

I've been trying to develop a Rails gem/plugin with generators for
Rails 3. I first had a separate gem project with a gem statement in my
Gemfile with a :path option to point at it. But then I had to run $
rake install on each change in my gem to have Rails pick up on it. I
have now instead put my generators inside RAILS_ROOT/lib so they are
easier to test/develop.

lib/generators
- ability
     ability_generator.rb
- clear
- config

When I run $ rails g
...
AuthAssist:
  auth_assist:ability
  auth_assist:clear
  auth_assist:config

$ rails g auth_assist:ability
Could not find generator auth_assist:ability.

What am I doing wrong here? Must the generators be in a gem/plugin to
be picked up by Rails?
What is the best/easiest approach for developing plugins/generators
with Rails 3?

Thanks!

Hi,

I’ve been trying to develop a Rails gem/plugin with generators for

Rails 3. I first had a separate gem project with a gem statement in my

Gemfile with a :path option to point at it. But then I had to run $

rake install on each change in my gem to have Rails pick up on it. I

have now instead put my generators inside RAILS_ROOT/lib so they are

easier to test/develop.

lib/generators

  • ability

    ability_generator.rb

  • clear

  • config

When I run $ rails g

AuthAssist:

auth_assist:ability

auth_assist:clear

auth_assist:config

$ rails g auth_assist:ability

Could not find generator auth_assist:ability.

What am I doing wrong here? Must the generators be in a gem/plugin to

be picked up by Rails?

What is the best/easiest approach for developing plugins/generators

with Rails 3?

Thanks!

This might help… http://github.com/indirect/rails3-generators

I have not really looked into generators recently but I am guessing not much has changed.

Anuj

I worked it out myself. It had to do with the fact that the generators
for some reason require the namespace to match a containing folder,
much like the Java package mechanism.

lib/generators
- auth_asisst
   - ability
     ability_generator.rb

# ability_generator.rb
module AuthAssist
  module Generators
    class AbilityGenerator < Rails::Generators::Base
...

A bit akward IMO, that a generator can be picked up as available but
then can't be found when attempting to run it.
Would be nice with a better error message such as "can't find x:y in
generators/x/y_generator.rb as expected."

I worked it out myself. It had to do with the fact that the generators

for some reason require the namespace to match a containing folder,

much like the Java package mechanism.

lib/generators

  • auth_asisst

    • ability

      ability_generator.rb

ability_generator.rb

module AuthAssist

module Generators

class AbilityGenerator < Rails::Generators::Base

A bit akward IMO, that a generator can be picked up as available but

then can’t be found when attempting to run it.

Would be nice with a better error message such as "can’t find x:y in

generators/x/y_generator.rb as expected."

Yeah, I have felt the need for a proper error message otherwise you can’t really tell what is going on. I will add a Lighthouse ticket for the same.

Anuj

On another note:

I would like to have available the methods used in Rails 3 templates.
I see many generators including Rails::Generators::Migration and using
the method migration_template to create a new migration.
What I would like is for my generator to create the options for
running a basic migration command, say:
$ rails g migration add_user_name_to_user user_name:string

But to be run from inside my migration. I tried the following

migration 'add_user_name_to_user user_name:string'

But the migration method is not available by default and I can't seem
to find it anywhere... any idea how to do this?
I could hack it using "run" which works, but produces:

run rails g migration add_admin_field_to_user admin:boolean from "."

Which just doesn't feel right :wink:

Thanks!

On another note:

I would like to have available the methods used in Rails 3 templates.

I see many generators including Rails::Generators::Migration and using

the method migration_template to create a new migration.

What I would like is for my generator to create the options for

running a basic migration command, say:

$ rails g migration add_user_name_to_user user_name:string

But to be run from inside my migration. I tried the following

migration ‘add_user_name_to_user user_name:string’

But the migration method is not available by default and I can’t seem

to find it anywhere… any idea how to do this?

I could hack it using “run” which works, but produces:

run rails g migration add_admin_field_to_user admin:boolean from “.”

Which just doesn’t feel right :wink:

Thanks!

Just have a look at rails3-generators in github. It has got generators for datamapper, haml and so on. I am sure you can find clues there.

On a further note. I can't seem to get any .rb files in RAILS_ROOT/lib
to load when I start my rails server.

Say I have a file

# lib/auth_assistant.rb
puts "Hello from AuthAssist"

On a further note. I can’t seem to get any .rb files in RAILS_ROOT/lib

to load when I start my rails server.

Say I have a file

lib/auth_assistant.rb

puts “Hello from AuthAssist”

In the old days of Rails 2.3+ you would put a require statement in

application.rb, but I think in Rails 3 all files in lib should be

loaded by default!?

How do I configure my lib files to be loaded in Rails 3?

I think you still need to require it in the application.rb file. I might be wrong as I have not been following the Rails-core development as much so don’t take my word for it.

Anuj

It turned out I had to include the require statement in an
initializer. Putting it in the application.rb didn't work (not found
error). I has to due with the load order I'm sure.
Thanks for the help :slight_smile: