在 gem 中为 rails 建造发电机 4
building generator in gem for rails 4
我查看并尝试了各种关于使用生成器创建 gem 的方法。也许我的疲倦让我忘记了一些事情,或者可能只是我缺乏经验。无论哪种方式,我都试图了解如何构建一个 gem 这是一个简单的生成器,以便我可以在未来的项目中重用代码。是的,我正在构建一些已经存在的东西,但作为一名学习者,我更感兴趣的是了解如何构建一个 gem,这样我就可以在未来贡献更有意义的东西,而不是仅仅使用已经完成的 [=35] =]s 不知道到底发生了什么。因此,事不宜迟,我的代码如下所示:
tree for simpauth
-lib
-generators
-simpauth
-templates
sessions.rb
install_generator.rb
-simpauth
simpauth.rb
这是我的 generators/simpauth/install_generator.rb
代码
require 'rails/generators'
module Simpauth
class InstallGenerator < ::Rails::Generators::Base
source_root File.expand_path('../templates', __FILE__)
desc "Creating simple and customizable authentication"
def add_session
copy_file "sessions.rb", "app/controllers/sessions_controller.rb"
end
end
end
我的generators/simpauth/templates/sessions.rb
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email])
if user && user.authenticate(params[:session][:password])
#login user and redirect to user_path
log_in user
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
redirect_to user
else
flash.now[:danger] = "invalid email and/or password"
render 'new'
end
end
def destroy
log_out if logged_in?
redirect_to root_url
end
end
和lib/simpauth.rb
require "simpauth/version"
require 'rails'
module Simpauth
class Engine < Rails::Engine
end
end
也simpauth.gemspec
# coding: utf-8
$:.push File.expand_path('../lib', __FILE__)
require 'simpauth/version'
Gem::Specification.new do |spec|
spec.name = "simpauth"
spec.version = Simpauth::VERSION
spec.authors = ["My Name"]
spec.email = ["my_email@example.com"]
spec.summary = %q{Simplified authentication}
spec.description = %q{}
spec.homepage = ""
spec.license = "MIT"
spec.files = `git ls-files -z`.split("\x0")
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
spec.add_development_dependency "bundler", "~> 1.7"
spec.add_development_dependency "rake", "~> 10.0"
end
如有任何帮助,我们将不胜感激。
编辑 - 此代码在 rails 应用程序中按预期工作。当安装为 gem.
时,我无法让 rails 识别生成器
我发现我的问题与我的 gemspec 文件有关。特别是 spec.file 赋值。我改变了:
spec.file = `git ls-files -z`.split("\x0")
到
spec.file = Dir["{lib,vendor}/**/*"]
解决了我的问题。
我查看并尝试了各种关于使用生成器创建 gem 的方法。也许我的疲倦让我忘记了一些事情,或者可能只是我缺乏经验。无论哪种方式,我都试图了解如何构建一个 gem 这是一个简单的生成器,以便我可以在未来的项目中重用代码。是的,我正在构建一些已经存在的东西,但作为一名学习者,我更感兴趣的是了解如何构建一个 gem,这样我就可以在未来贡献更有意义的东西,而不是仅仅使用已经完成的 [=35] =]s 不知道到底发生了什么。因此,事不宜迟,我的代码如下所示:
tree for simpauth
-lib
-generators
-simpauth
-templates
sessions.rb
install_generator.rb
-simpauth
simpauth.rb
这是我的 generators/simpauth/install_generator.rb
代码require 'rails/generators'
module Simpauth
class InstallGenerator < ::Rails::Generators::Base
source_root File.expand_path('../templates', __FILE__)
desc "Creating simple and customizable authentication"
def add_session
copy_file "sessions.rb", "app/controllers/sessions_controller.rb"
end
end
end
我的generators/simpauth/templates/sessions.rb
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email])
if user && user.authenticate(params[:session][:password])
#login user and redirect to user_path
log_in user
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
redirect_to user
else
flash.now[:danger] = "invalid email and/or password"
render 'new'
end
end
def destroy
log_out if logged_in?
redirect_to root_url
end
end
和lib/simpauth.rb
require "simpauth/version"
require 'rails'
module Simpauth
class Engine < Rails::Engine
end
end
也simpauth.gemspec
# coding: utf-8
$:.push File.expand_path('../lib', __FILE__)
require 'simpauth/version'
Gem::Specification.new do |spec|
spec.name = "simpauth"
spec.version = Simpauth::VERSION
spec.authors = ["My Name"]
spec.email = ["my_email@example.com"]
spec.summary = %q{Simplified authentication}
spec.description = %q{}
spec.homepage = ""
spec.license = "MIT"
spec.files = `git ls-files -z`.split("\x0")
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
spec.add_development_dependency "bundler", "~> 1.7"
spec.add_development_dependency "rake", "~> 10.0"
end
如有任何帮助,我们将不胜感激。
编辑 - 此代码在 rails 应用程序中按预期工作。当安装为 gem.
时,我无法让 rails 识别生成器我发现我的问题与我的 gemspec 文件有关。特别是 spec.file 赋值。我改变了:
spec.file = `git ls-files -z`.split("\x0")
到
spec.file = Dir["{lib,vendor}/**/*"]
解决了我的问题。