Thor:类变量不起作用

时间:2014-08-03 15:10:27

标签: ruby-on-rails ruby command-line-interface thor

我有以下测试代码。

require "thor"

module Snap
  class CLI < Thor
    desc 'login', 'Login Credentials'
    def login(user,pass)
      @username = user
      @password = pass
      say @password
    end

    desc 'block', 'Block user'
    def block(input)
      say @username
    end
  end
end

如果我在命令行中输入Snap login abc xyz。 我得到输出为xyz。 但是当我输入Snap block a时。 我得到的输出只是一个空白区域。 即:没有任何东西存储在用户名或密码。

为什么会这样,我该如何解决?

1 个答案:

答案 0 :(得分:2)

问题是程序在两次命令调用之间终止。因此,所有状态都会丢失,因此用户名将丢失。

为了在您的命令的多个调用中保留变量,您需要将其保存到文件中。例如,您可以以yaml格式将隐藏文件保存在用户的主目录中。

注意:请注意,这会将密码以明文形式存储在配置文件中!

require 'thor'
require 'yaml'

module Snap
  class CLI < Thor
    def initialize(*args)
      super
      read_config
    end

    desc 'login', 'Login Credentials'
    def login(user, pass)
      @username = user
      @password = pass
      say @password
      write_config
    end

    desc 'block', 'Block user'
    def block(input)
      say @username
    end

    private

    CONFIG_FILE = '~/.myprogram.conf'

    def write_config
      config = {}
      config['username'] = @username
      config['password'] = @password
      File.open(CONFIG_FILE, 'w') do |f|
        f.write config.to_yaml
      end
    end

    def read_config
      config = YAML.load_file(CONFIG_FILE)
      @username = config['username']
      @password = config['password']
    end
  end
end