小编jan*_*o-m的帖子

是否可以要求 Gemfile 之外的文件?

例如,我正在开发一个gem,在开发时,我使用pryIRB代替IRB,并debugger进行调试。但是,我不希望可能的贡献者必须安装它们(因为他们可能不需要它们)。我的第一个想法是将它们放入 Bundler 组中:

source :rubygems

gemspec

group :extras do
  gem "pry"
  gem "debugger"
end
Run Code Online (Sandbox Code Playgroud)

然后人们可以使用:

$ bundle install --without extras
Run Code Online (Sandbox Code Playgroud)

但我希望它是默认的,它们没有安装。完美的是它们不在我的中Gemfile,但我仍然可以需要它们(如果它们存在于计算机上)。这个解决方案应该没问题,因为我不在乎它们被锁定在哪个版本。能做到吗?

ruby rubygems bundler

5
推荐指数
1
解决办法
992
查看次数

Ruby enumerables不保持同一个类

我有一个代表集合的类.我将Enumerable模块包含在其中并定义了方法#each,以便我获得所有方法.

但问题是,Enumerable方法不能保持同一类.所以,例如,如果我的类被命名Collection,如果我这样做Collection#select,我希望结果的类也是Collection(而不是Array).有没有办法如何实现这一目标?

ruby enumerable

4
推荐指数
2
解决办法
182
查看次数

为什么Open3.popen3在缺少可执行文件时返回错误的错误?

我正在围绕CLI创建一个Ruby包装器.我发现了一个简洁的方法Open3.capture3(内部使用Open3.popen3),它允许我执行命令并捕获stdout,stderr和退出代码.

我想要检测的一件事是,是否找不到CLI可执行文件(并为此引发特殊错误).我知道UNIX shell 127在找不到命令时会提供退出代码.当我$ foo在bash中执行时,我得到了-bash: foo: command not found,这正是我想要显示的错误消息.

考虑到所有这些,我编写了这样的代码:

require "open3"

stdout, stderr, status = Open3.capture3(command)
case status.exitstatus
when 0
  return stdout
when 1, 127
  raise MyError, stderr
end
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时command = "foo",我收到一个错误:

Errno::ENOENT: No such file or directory - foo
  /Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:193:in `spawn'
  /Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:193:in `popen_run'
  /Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:93:in `popen3'
  /Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:252:in `capture3'
Run Code Online (Sandbox Code Playgroud)

为什么会出现此错误?我以为Open3.capture3应该直接在shell中执行该命令,为什么我不能得到正常的STDERR并退出代码127

ruby popen3

3
推荐指数
1
解决办法
2588
查看次数

如何更改自定义rails生成器的源?(雷神)

我正在制作一个自定义生成器,生成一个新的rails应用程序,我这样做

require 'thor'
require 'rails/generators/rails/app/app_generator'

class AppBuilder < Rails::AppBuilder
  include Thor::Actions
  include Thor::Shell
  ...
end
Run Code Online (Sandbox Code Playgroud)

问题是,我如何添加一个新的源目录(然后使用Thor::Actions#copy_file,Thor::Actions#template,和其他人)?我在Thor的文档中看到了Thor::Actions#source_paths保存源代码(它是一个路径数组),所以我尝试在我的课程中覆盖它(因为我已经包括在内Thor::Actions):

def source_paths
  [File.join(File.expand_path(File.dirname(__FILE__)), "templates")] + super
end
Run Code Online (Sandbox Code Playgroud)

有了这个,我想./templates在源代码中添加目录,同时仍然保持Rails的一个(这就是+ super最后的原因).但它不起作用,它仍然将Rails的源路径列为唯一的路径.

我尝试浏览Rails的源代码,但我找不到Rails如何将他的目录放在源路径中.我真的想知道:)

ruby-on-rails generator thor

2
推荐指数
2
解决办法
1877
查看次数

如何增强ruby中的attr_accessor?

我想实现一个(类)方法attr_accessor_with_client_reset,它执行相同的操作attr_accessor,但是在它另外执行的每个编写器上

@client = nil
Run Code Online (Sandbox Code Playgroud)

所以,例如,

attr_accessor_with_client_reset :foo
Run Code Online (Sandbox Code Playgroud)

应该产生相同的结果

attr_reader :foo

def foo=(value)
  @foo = value
  @client = nil
end
Run Code Online (Sandbox Code Playgroud)

我该如何实现这一目标?

ruby attributes metaprogramming attr-accessor

2
推荐指数
1
解决办法
353
查看次数

可以在方法参数中传递大对象吗?

我正在做Rails应用程序,人们可以在这里进行测验.我有一个模型BrowserGame正在处理控制器逻辑(会话,重定向等).目前,这是我的#initialize方法:

class BrowserGame
  def initialize(controller)
    @controller = controller
  end
end
Run Code Online (Sandbox Code Playgroud)

在控制器中我有一个方法

class GamesController < ApplicationController

  # actions

  private

  def browser_game
    BrowserGame.new(self)
  end
end
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我将整个控制器传递给BrowserGame#initialize(因此我可以使用会话和其他人操作).这是一个好主意吗?是否有任何副作用,因为控制器实例是一个大对象?

ruby ruby-on-rails

2
推荐指数
1
解决办法
878
查看次数

如何在开发gem时使用'debugger'和'pry'?(红宝石)

我正在开发一个gem,我的Gemfile看起来像这样:

source :rubygems

gemspec

group :development, :test do
  gem "pry"
  gem "debugger"
  gem "rake"
end
Run Code Online (Sandbox Code Playgroud)

但是,我不希望人们必须安装prydebugger运行测试,但我也希望能够在我的测试中要求它们(因为我正在运行带有前缀的测试bundle exec,我无法在我的加载路径中获取它们如果他们不在Gemfile中).我该如何实现这一目标?

另外,何时将用于开发的宝石放在gemspec中,何时将它们放入Gemfile中?我真的不知道区别.

ruby testing gem bundler gemspecs

1
推荐指数
1
解决办法
2603
查看次数

花括号中的变量不起作用

我有一个包含国家/地区文件夹的目录,其中可能存在具有双重名称的文件夹:

 en_en es_es fr_fr de_de
Run Code Online (Sandbox Code Playgroud)

我写了一个脚本来删除重复:

 for code in en de es fr it nl pt tr; do
   if [[ -d $code_$code ]]; then
     mv "${code}_${code}" "${code}"
   fi
 end
Run Code Online (Sandbox Code Playgroud)

但它不起作用 - if永远不会执行代码(我也试过放在echo那里).但是,以下工作:

 if [[ -d es_es ]]; then
   echo "foo"
 end
Run Code Online (Sandbox Code Playgroud)

我正在使用(日志)bash 3.2.

bash shell curly-braces

1
推荐指数
1
解决办法
150
查看次数

WebAuthn 是否支持查找密钥的存储位置?

当我尝试为我的 Google 帐户创建密钥时,我惊讶地发现它知道我的密钥存储在哪里(1Password、iCloud 钥匙串、安全密钥等)。

现在,我已经研究 WebAuthn 协议一段时间了,甚至查看了协议扩展,但我找不到任何方法来获取有关用户注册的密钥类型的信息。

WebAuthn 支持吗?我认为这将是一个很好的替代方案,可以替代要求用户为其密钥提供昵称的方法。

authentication web webauthn passkey

1
推荐指数
1
解决办法
411
查看次数