代码之家  ›  专栏  ›  技术社区  ›  Madhusudhan

插件中的生成器和迁移(Rails 3)

  •  9
  • Madhusudhan  · 技术社区  · 15 年前

    我只是想创建一个没有任何参数的插件迁移生成器,比如: $rails generate yaffle 这应该将迁移文件(lib/generators/yaffle/template/create_yaffle.rb)复制到db/migrate/[timestamp]create_yaffle.rb。

    1. 我在这里面临的问题是,它的复制,但是没有时间戳。
    2. 还有,当我跑步时 $rails生成yaffle 它给了我一条消息,说明没有提供参数,它应该采用这种格式 rails generate yaffle NAME [options] . 我不想有任何选择/争论,应该是 rails generate yaffle 。

    我该怎么办?

    我跟着发电机 acts_as_commentable ,看起来很简单,但我不知道在哪里修改这些设置…有人能帮忙吗?

    发电机代码:

    require 'rails/generators'
    require 'rails/generators/migration'
    
    class ThumbitGenerator  Rails::Generators::NamedBase
      source_root File.expand_path('../templates', __FILE__)
    
      def self.next_migration_number(path)
        Time.now.utc.strftime("%Y%m%d%H%M%S")
      end
    
      def create_model_file
        template "like.rb", "app/models/like.rb"
        template "liking.rb", "app/models/liking.rb"
        template "create_likes.rb", "db/migrate/create_likes.rb"
        template "create_likings.rb", "db/migrate/create_likings.rb"
      end
    
    end
    
    3 回复  |  直到 9 年前
        1
  •  22
  •   Madhusudhan    15 年前

    好吧,我找到了答案…

    1. 我在用 Rails::Generators::NamedBase 而不是 Rails::Generators::Base 在我的生成器文件中!使用名称数据库时,它总是希望传递一个参数(初始值设定项的名称)。

      说明: guides.rubyonrails.org/generators

    2. 我用的是 template 方法而不是 migration_template 因为迁移文件不产生任何迁移号

      说明: Rails::Generators::Migration.migration_template

    所以,最后,这个成功了!

    require 'rails/generators'
    require 'rails/generators/migration'
    
    class ThumbitGenerator < Rails::Generators::Base
      include Rails::Generators::Migration
      source_root File.expand_path('../templates', __FILE__)
    
      def self.next_migration_number(path)
        Time.now.utc.strftime("%Y%m%d%H%M%S")
      end
    
      def create_model_file
        template "like.rb", "app/models/like.rb"
        template "liking.rb", "app/models/liking.rb"
        migration_template "create_likes.rb", "db/migrate/create_likes.rb"
        migration_template "create_likings.rb", "db/migrate/create_likings.rb"
      end
    end
    
        2
  •  3
  •   Sava Lachezarov    9 年前

    解决方案的一个小亮点-为了避免为迁移定义时间戳的麻烦,以及在Rails核心团队决定使用另一种冲压方式(例如,将sha哈希截断为10个字符)的情况下为您的生成器提供未来验证,您可以 require 'rails/generators/active_record' 和 extend ActiveRecord::Generators::Migration 这样地:

    require 'rails/generators'
    require 'rails/generators/migration'
    require 'rails/generators/active_record'
    
    class ThumbitGenerator < Rails::Generators::Base
      include Rails::Generators::Migration
      extend ActiveRecord::Generators::Migration
    
      source_root File.expand_path('../templates', __FILE__)
    
      def create_model_file
        template "like.rb", "app/models/like.rb"
        template "liking.rb", "app/models/liking.rb"
        migration_template "create_likes.rb", "db/migrate/create_likes.rb"
        migration_template "create_likings.rb", "db/migrate/create_likings.rb"
      end
    end
    

    在Rails 4中更新 ActiveRecord::Generators::Migration 不再是模块,请改用:

    require 'rails/generators'
    require 'rails/generators/migration'
    require 'rails/generators/active_record'
    
    class ThumbitGenerator < Rails::Generators::Base
      include Rails::Generators::Migration
      # Implement the required interface for Rails::Generators::Migration
      def self.next_migration_number(dirname)
        ActiveRecord::Generators::Base.next_migration_number(dirname)
      end
    
      source_root File.expand_path('../templates', __FILE__)
    
      def create_model_file
        template "like.rb", "app/models/like.rb"
        template "liking.rb", "app/models/liking.rb"
        migration_template "create_likes.rb", "db/migrate/create_likes.rb"
        migration_template "create_likings.rb", "db/migrate/create_likings.rb"
      end
    end
    
        3
  •  1
  •   montrealmike    13 年前

    你可以简单地继承自 ActiveRecord::Generators::Base 一切都会好起来的