Long Hoang

People often call me Tobi, but you can call me tonight!

Navigation
 » Home
 » About Me
 » Github
 » XML Feed

Customize rails generate

04 Feb 2017 » ruby, rails

Với dự án lớn, việc phân chia cấu trúc thư mục rõ ràng thì sẽ dễ dàng cho việc maintain sau này. Ngoài các thư mục MVC còn phát sinh thêm các thư mục như decorators, services object. Việc tạo tay các file trong các thư mục này sau mỗi lần generate rất phiền hà. Thay vào đó ta có thể config để nó sinh ra kèm theo khi ta rails g

rails new new_app
cd new_app 

Ta chạy lệnh rails g generator rails/my_customize

Running via Spring preloader in process 13177
Expected string default value for '--jbuilder'; got true (boolean)
      create  lib/generators/rails/my_customize
      create  lib/generators/rails/my_customize/my_service_generator.rb
      create  lib/generators/rails/my_customize/USAGE
      create  lib/generators/rails/my_customize/templates
      invoke  test_unit
      create    test/lib/generators/rails/my_customize_generator_test.rb

Trong file lib/generators/rails/my_customize/my_service_generator.rb

class Rails::MyCustomizeGenerator < Rails::Generators::NamedBase
  def create_service_file
    create_file "app/services/#{name}_service.rb", <<-FILE
class #{class_name}Service
  def initialize(current_user, params)
  end
end
    FILE
  end
end

Ở đây ta muốn với mỗi lần generate nó sẽ tạo thêm một file trong thư mục services và có nội dung là

class #{class_name}Service
  def initialize(current_user, params)
  end
end

Sau đó, trong file config/application.rb Ta thêm vào:

    config.generators do |g|
      g.helper :my_customize
    end

Có rất nhiều tùy chọn config khác, ta có thêm tham khảo thêm ở [http://guides.rubyonrails.org/generators.html]

Như thế là ta đã config xong. Có thể test ngay bằng

rails g controller user/information index 
      create  app/controllers/user/information_controller.rb
      route  namespace :user do
        get 'information/index'
      end
      invoke  erb
      create    app/views/user/information
      create    app/views/user/information/index.html.erb
      invoke  test_unit
      create    test/controllers/user/information_controller_test.rb
      invoke  my_service
      create    app/services/user/information_service.rb
      invoke  assets
      invoke    coffee
      invoke    scss