H5W3
当前位置:H5W3 > 其他技术问题 > 正文

Rails Engine使用笔记

Rails Template

如果要按照最新的rails的来新建项目的话,可以使用这个命令rails new myapp -T -m https://raw.github.com/RailsApps/rails-composer/master/composer.rb --edge
自己写template:链接
可以用的命令:链接

避免每次都输入bundle exec

bundle install --binstubs=./bundler_stubs
bundle exec spring binstub --all

新建Engine

system('rails plugin new zangcun-core --mountable -T --edge --dummy-path=spec/dummy')
# engine_root/config/spring.rb
Spring.application_root = "spec/dummy"
# engine_root/spec/dummy/config/spring.rb
Spring.application_root = ""
# engine_root/spec/dummy/
system('bundle exec spring binstub --all')
# engine_root/spec/dummy/bin/spring
# 在第二行添加
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
# engine_root
system('bin/rails g rspec:install')
# engine_root
system('guard init')
# 将guard file中对rspec中的监听方法改为
guard :rspec, cmd: "spec/dummy/bin/rspec"

# engine_root/spec/spec_helper.rb

require 'faker'
require 'factory_girl_rails'
require 'database_cleaner'
FactoryGirl.definition_file_paths = [
  File.expand_path('../factories', __FILE__)
]
FactoryGirl.find_definitions
RSpec.configure do |config|
    # rspec-expectations config goes here. You can use an alternate
    # assertion/expectation library such as wrong or the stdlib/minitest
    # assertions if you prefer.
    config.before(:suite) { FactoryGirl.reload }
    config.include FactoryGirl::Syntax::Methods
end

# engine_root/spec/rails_helper.rb
ENV["RAILS_ENV"] ||= 'test'
require 'spec_helper'
require File.expand_path("../dummy/config/environment", __FILE__)
require 'rspec/rails'
ActiveRecord::Migrator.migrations_path = ["#{Rails.application.root}/db/migrate"]
ActiveRecord::Migration.maintain_test_schema!
RSpec.configure do |config|
  config.fixture_path = "../factories"

  config.use_transactional_fixtures = true

  config.infer_spec_type_from_file_location!
end

Core

将核心的逻辑写入到Core中
rails plugin new zangcun-core --mountable -T --edge --dummy-path=spec/dummy 加中划线会把core添加在zangcun的moudle中

backend 后台

rails plugin new zangcun-backend --mountable -T --edge --dummy-path=spec/dummy

Frontend 前端

rails plugin new ydjc-front --mountable -T --edge --dummy-path=spec/dummy
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../../ydjc_core/lib')

Api

rails plugin new ydjc-front --mountable -T --edge --dummy-path=spec/dummy
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../../ydjc_core/lib')

Engine规则

如果需要在Engine使用其他的Gem包,需要在Gemfile中添加,然后在gemspec添加add_dependency
修改Engine的generator框架

config.generators do |g|
   g.test_framework :rspec
   g.fixture_replacement :factory_girl, :dir => 'spec/factories'
   g.template_engine :slim
end

migration

在宿主中运行bin/rake railties:install:migrations 会把Engine中的migration拷贝至宿主中。

修改测试规则

在每个Engine中测试各自的spec,需要修改spec_rails.rb文件

ActiveRecord::Migrator.migrations_path = ["#{Rails.application.root}/db/migrate"]
require File.expand_path("../dummy/config/environment", __FILE__)

Gem

在gemspec使用本地的gem作为depencence
在gemspec中使用git上面的gem作为depencence

$LOADPATH是ruby的搜索路径。
所以如果需要require其他的Gem包,就需要将其他的gem包的lib目录添加至LOADPATH中。

Assets

如果需要使用Engine中的assets,需要把这些文件添加至precompile中。

# 在engine文件添加
 initializer "ydjc.assets.precompile", group: :all do |app|
   app.config.assets.precompile += %w[
     ydjc/front/front.css
     ydjc/front/front.js
   ]
 end

引用时候需要使用全路径stylesheet_link_tag "yjdc/front/front"
因为Rails只会搜索Engine中的app/assests/stylesheets目录。

测试

方便调试

web-console
better_errors
byebug
pry-rails

性能调优

request-log-analyzer
derailed_benchmarks
ruby-prof
oink https://github.com/noahd1/oink
代码规范rubocop https://github.com/bbatsov/rubocop

问题

spring

spring在engine中无法使用,在test/dummy
需要在springload之前,先声明ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)

cache

需要在application中设置,Engine中设置没有用。

本文地址:H5W3 » Rails Engine使用笔记