小编saw*_*awa的帖子

为什么ruby中的splat参数不是一直使用的?

我知道当我们不知道将传递的参数数量时,会使用splat参数.我想知道我是否应该一直使用splat.每当我传递参数时,使用splat参数是否有任何风险?

ruby splat

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

对于名称与复数相同的模型,`has_many,:through`不在一个方向上工作

我正在构建一个应用程序来为星球大战RPG生成角色.我添加了Species模型.Species是复数的单数,这是一个循环.我可以通过使用在应用程序中使路由正常工作species_index_path,但由于某种原因,has_many :characteristics, :through => :species_characteristics它不是在一个方向上工作.

例如,我有两个模型在控制台中正确播种(和工作):CharacteristicsSpecies.Characteristics按以下方式设置:

class Characteristic < ActiveRecord::Base
    has_many :species_characteristics
    has_many :species, :through => :species_characteristics
    has_many :skills
end
Run Code Online (Sandbox Code Playgroud)

Species 按以下方式设置:

class Species < ActiveRecord::Base
    has_many :species_characteristics
    has_many :characteristics, :through => :species_characteristics
end
Run Code Online (Sandbox Code Playgroud)

他们之间的模型只有一个belongs_to.

如果我Characteristic.first.species从控制台打电话,我会得到与该特征相关的物种清单.

Species.first.characteristics但是,如果我打电话,我会得到以下信息:

NameError: uninitialized constant Species::Characteristics
Run Code Online (Sandbox Code Playgroud)

我期待增加一个新的变形,或者某种方式,但我什么都没有.有没有人有更好的方法将模型重命名为Race?


TLDR:has_many由于未初始化的常量错误,关系不能仅在一个方向上起作用,可能是由于拐点问题.除了重命名模型之外,还有什么方法可以修复它吗?

ruby initialization ruby-on-rails inflection ruby-on-rails-4

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

将app_host设置为Capybara的内容

我的测试尝试访问网页并验证页面上是否存在某些元素.例如,它访问http://foo.com/homepage.html并检查徽标图像,然后访问http://bar.com/store/blah.html并检查页面上是否显示某些文本.我的目标是访问Kerberos身份验证的网页.

我发现Kerberos代码如下:

主文件

uri = URI.parse(Capybara.app_host)
kerberos = Kerberos.new(uri.host)
@kerberos_token = kerberos.encoded_token
Run Code Online (Sandbox Code Playgroud)

kerberos.rb文件

class Kerberos
    def initialize(host)
      @host = host
      @credentials = AuthGss::Negotiate.new("HTTP@#{@host}")
      @credentials.cache = ENV['KRB5CCNAME'] if ENV['KRB5CCNAME']
      @token = @credentials.step("")
    end

    def encoded_token
      Base64.encode64(@token).gsub(/\n/,"")
    end
  end
Run Code Online (Sandbox Code Playgroud)

它利用Capybara.app_host价值.我无法弄清楚要设置的Capybara.app_host值.我无法弄清楚它的作用.我有Capybara.run_server = false.有人可以帮助我了解如何使用Capybara.app_host以及这与Kerberos身份验证的关系?

ruby kerberos capybara phantomjs

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

为什么只有在使用`send`时才会查找内核方法?

我应该能够Kernel在每个对象上调用方法,并format定义方法Kernel.为什么用第三个例子method_missing调用Kernel

class A
  def method_missing(meth, *args, &block)
    if meth == :foo
      puts 'ok'
    elsif meth == :format
      puts 'ok'
    end
  end
end

a = A.new
a.foo           # => ok
a.send(:foo)    # => ok
a.format        # => ok
a.send(:format) # => too few arguments (ArgumentError)
Run Code Online (Sandbox Code Playgroud)

ruby

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

创建特殊整数

我想FOO在名称空间中定义一个Integer类似于Float::NANin 的常量Float,它本身就是一个实例Float.它将在某种程度上类似于符号,即标记特殊情况(整数).我不需要它用于计算,但我需要它具有以下属性:

  • 它的类必须是Integer或者是Integer它的子类,并且它必须对与类相关的方法起作用:

    Integer::FOO.kind_of?(Integer) # => true
    
    Run Code Online (Sandbox Code Playgroud)

    可选(如果是这个类Integer):

    Integer::FOO.class # => Integer
    Integer === Integer::FOO # => true
    Integer::FOO.instance_of?(Integer) # => true
    
    Run Code Online (Sandbox Code Playgroud)
  • 它必须与(理想情况下所有)其他整数不同:

    Integer::FOO == 0 # => false
    
    Run Code Online (Sandbox Code Playgroud)

    理想情况下,我希望它与任何其他整数不同,但如果这是不可能的,我可以忍受一个肮脏的黑客,比如使得Integer::FOO与最大或最小的整数相同,这是最不可能击中任何随机给定的整数.

最好的方法是什么?

ruby integer constants nan

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

在nil上传递splat作为参数

b下面的所有值都让我用*args语法调用方法.

def some_method(a)
   puts a
end

b = 1
some_method(*b) # => 1

b = false
some_method(*b) # => false

b = "whatever"
some_method(*b) # => "whatever"
Run Code Online (Sandbox Code Playgroud)

有了nil,我期望得到nil,而不是参数错误:

b = nil
some_method(*b) # => ArgumentError: wrong number of arguments (0 for 1)
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

ruby null arguments splat

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

Ruby unescape HTML字符串

知道如何在Ruby中使用以下字符串吗?

C&#x3a;&#x5c;inetpub&#x5c;wwwroot&#x5c;adminWeb
Run Code Online (Sandbox Code Playgroud)

C:\inetpub\wwwroot\adminWeb
Run Code Online (Sandbox Code Playgroud)

或者

C%3A%5Cinetpub%5Cwwwroot%5CadminWeb
Run Code Online (Sandbox Code Playgroud)

试图URI.decode没有成功.

ruby html-escape-characters

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

当从文件中读取时,为什么在`to_i`之上需要`to_s`?

"98"从一个文件中读取一个数字,并尝试将其转换为二进制文件input.to_i(2),但我得到了0这种方式.

input=File.read("input.dat")
puts "Input is: #{input}"
puts "Normal way is #{input.to_i(2)}"
puts "It works this way #{input.to_i.to_s(2)}"
puts "Calling the number directly works #{98.to_s(2)}"
Run Code Online (Sandbox Code Playgroud)

输出是:

Input is: 98
Normal way is 0
It works this way 1100010
Calling the number directly works 1100010
Run Code Online (Sandbox Code Playgroud)

ruby string

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

为什么Ruby会返回`str [-1..1]`它的作用是什么?

假设我们有一个字符串str.str例如,如果只包含一个字符str = "1",则str[-1..1]返回1.
但是如果size(length)的str长度大于1 str = "anything else",那么str[-1..1]返回""(空字符串).

为什么Ruby会像这样解释字符串切片?

ruby string

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

Ruby 对象与哈希

下面的代码片段返回一个对象。

class Person
  def initialize(name, gender)
    @name = name
    @gender = gender
  end
end
x = Person.new("Dan", "M")
=> #<Person:0x007f6f96600560 @name="Dan", @gender="M">
Run Code Online (Sandbox Code Playgroud)
  • < ... >对象和哈希有什么区别{ ... }?为什么 Ruby 类不只返回哈希值?
  • 0x007f6f96600560对象中的是什么?我很确定不是object_id

ruby

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