1

ジェネレーターを使用して宝石を作成することに関して、さまざまなことを調べて試しました。疲れて何かを忘れているのかもしれませんし、単に経験不足なのかもしれません。いずれにせよ、将来のプロジェクトでコードを再利用できるように、単純なジェネレーターである宝石を構築する方法を理解しようとしています。はい、私はすでに存在するものを構築していますが、学習者として、実際に何が起こっているのかを知らずにすでに作成された宝石を使用するよりも、将来より有意義なものに貢献できるように、宝石を構築する方法を理解することに関心があります。の上。したがって、さらに苦労することなく、私のコードは次のようになります。

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

私のジェネレーター/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 にジェネレーターを認識させることができません。

4

1 に答える 1

0

問題が gemspec ファイルに関連していることがわかりました。具体的には、spec.file の割り当てを使用します。私が変更され:

spec.file = `git ls-files -z`.split("\x0")

spec.file = Dir["{lib,vendor}/**/*"]

私の問題を解決しました。

于 2015-03-05T19:28:46.973 に答える