小编And*_*imm的帖子

路由错误:Rails 3中未初始化的常量

我有一个包含辅助类的文件,如下所示:

应用程序/类/ myfile.rb

Module mymodule
  class myclass
    # blah blah
  end
end
Run Code Online (Sandbox Code Playgroud)

我想在控制器中使用这个类,所以我写了这样的东西:

require 'myfile'

class MyController < ApplicationController

  include mymodule  

  def index
    mymodule::myclass.new
  end

end
Run Code Online (Sandbox Code Playgroud)

控制器的路由定义如下:

  match 'mycontroller', :to => 'mycontroller#index'
Run Code Online (Sandbox Code Playgroud)

现在我面对的是奇怪的行为.它在服务器启动后的第一次运行时完美运行.但是当我刷新页面或再次点击URL时,我收到以下错误.

Routing Error

uninitialized constant MyController::mymodule
Run Code Online (Sandbox Code Playgroud)

我无法从错误中找出任何东西,也不能理解为什么它从第二次打击起不起作用.发生了什么?

ruby ruby-on-rails

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

红宝石中的穿插功能?

我正在寻找相当于Ruby中的haskell instersperse函数.基本上,在列表的每个元素之间添加一些东西(比如分隔符).

intersperse(nil, [1,2,3]) => [1,nil,2,nil,3,nil,4].
Run Code Online (Sandbox Code Playgroud)

我不是要求任何代码(我可以做到,我可能在你阅读这个问题之前已经完成了).我只是想知道标准Ruby平台上是否已经存在这样的功能.

更新

我不是要求任何代码,尤其是那些使用flatten的代码,因为它不起作用(flatten不仅平坦一个级别而且全部).我给出了示例[1,2,3]作为示例,但它应该可以使用

 [[1,2],[3,4]].interperse("hello") => [[1,2], "hello", [3,4]]
Run Code Online (Sandbox Code Playgroud)

(请不要向我发送任何代码以使其有效,我已经拥有它

class Array
  def intersperse(separator)
    (inject([]) { |a,v|  a+[v,separator] })[0...-1]
  end
end
Run Code Online (Sandbox Code Playgroud)

)

ruby

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

为什么Ruby模块包含会排除模块的单例类?

当在Ruby中继承类时,单例类也会被继承:

class A
  def self.hello
    puts "hello"
  end
end

class B < A
end

B.hello #=> "hello"
Run Code Online (Sandbox Code Playgroud)

但是对于模块,情况并非如此:

module M
  def self.goodbye
    puts "goodbye"
  end
end

class A
  include M
end

A.goodbye #=> NameError
Run Code Online (Sandbox Code Playgroud)

为了解决这个限制,许多人都会诉诸这个丑陋的黑客:

module M
  def self.included(c)
    c.extend ClassMethods
  end

  module ClassMethods
    def goodbye
      puts "goodbye"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

好的,我的问题是:这个模块限制背后有理论/概念上的原因吗?还是只是一个实施难度?

在查看C源代码(YARV/MRI)之后,我可以确定存在实施难度(不是不可克服的,但是一个完全相同),但这是唯一的原因吗?这种限制还有其他原因吗?

谢谢

ruby inheritance singleton module mixins

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

在Ruby中解析文件时跳过行的最快方法?

我试着寻找这个,但找不到多少.这似乎是之前可能会被问到的事情(很多次?),所以我很抱歉,如果是这样的话.

我想知道在Ruby中解析文件某些部分的最快方法是什么.例如,假设我知道我想要的特定功能的信息是在1000行文件的第500行和第600行之间.(显然这类问题适用于大型文件,我只是为了举例而使用那些较小的数字),因为我知道它不会出现在上半部分,是否有一种忽略这些信息的快速方法?

目前我正在使用以下内容:

while  buffer = file_in.gets and file_in.lineno <600
  next unless file_in.lineno > 500
  if buffer.chomp!.include? some_string
    do_func_whatever
  end
end
Run Code Online (Sandbox Code Playgroud)

它有效,但我不禁认为它可以更好地工作.

我对Ruby很陌生,并且有兴趣学习新的工作方式.

ruby lines fileparsing

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

如何要求rubygems帮助找到rubygem文件?

在尝试解决在irb中找到的Gem时,而不是在Ruby中,我试着看看require 'rubygems'对我自己的安装有什么影响:

$ irb
irb(main):001:0> RUBY_VERSION
=> "1.8.7"
irb(main):002:0> $:
["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/x86_64-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/x86_64-linux", "."]
=> nil
irb(main):003:0> require "rubygems" # Hasn't been required already
=> true
irb(main):004:0> require "rubygems" # Will return false, because it's already been required
=> false
irb(main):005:0> $: # Same as before
=> ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/x86_64-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/x86_64-linux", "."]
Run Code Online (Sandbox Code Playgroud)

如果请求rubygems不修改$:,那么它如何帮助查找文件?它是monkeypatch require吗?如果是这样,它使用什么变量来查找rubygem安装的库?

ruby rubygems

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

使用类似的键加载和生成Yaml文件

我有一个yaml文件文件有类似的键: -

sample_file.yml

line:
  title: line-name
  department: transcription

  input_formats:
    - input_format:
        name: company
        required: true
        valid_type: general
    - input_format:
        name: website
        required: false
        valid_type: url
Run Code Online (Sandbox Code Playgroud)

生成new_file.yml后,键按字母顺序排序: -

new_file.yml

line: 
  department: transcription
  input_formats: 
    - 
      input_format: 
      name: company
      required: true
      valid_type: general
    - 
      input_format: 
      name: website
      required: false
      valid_type: url

  title: line-name
Run Code Online (Sandbox Code Playgroud)

打开sample_file并生成new_file的代码如下: -

require 'yaml'
require 'ya2yaml'


@file = YAML::load(File.open("/Users/manish/Desktop/yaml/sample_file.yml"))
@new_file = File.new("/Users/manish/Desktop/yaml/new_file.yml", "w+") 
@new_file.syswrite(@file.ya2yaml(:hash_order => ['title','department','input_formats']))
Run Code Online (Sandbox Code Playgroud)

我正在使用"ya2yaml"gem生成yaml文件.为了获得与sample_file.yml中相同的顺序,我在这里使用了hash_order @new_file.syswrite(@file.ya2yaml(:hash_order => ['title','department','input_formats'])),但它不起作用.我如何保留订单?

ruby yaml rubygems ruby-on-rails ruby-on-rails-3

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

有没有替代方案来抢救Ruby的LoadError?

我阅读了博客文章JRuby Performance:Exceptions不是流量控制,它主张避免使用Exceptions,除非是特殊情况.

我意识到我犯了使用救援来定期处理LoadErrors的罪行.

是否有替代require尝试加载文件(如果存在),但如果不存在则不会抛出异常?

背景:如果你想知道"你为什么要求你不要求?",这是我的故事:

  1. 当我为Ruby 1.8编程时,我使用了require "rdoc/usage"如果我没有在命令行应用程序中输入正确数量的参数,我可以提供使用信息.这会在开箱即用的1.9上引发异常.
  2. 我的应用程序的一部分涉及在Windows桌面上运行时操作win32ole的代码.如果涉及的文件是在执行繁重计算工作的Linux服务器下运行,则会导致LoadError.使用win32ole的文件还有其他在我的测试套件中测试的代码,因此在Linux下运行我的测试套件时,我必须要求这些文件.我应该拆分这些文件,但这看起来有点像牦牛剃须.

ruby exception require

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

是否有惯用的ruby/rails方式返回第一个truthy映射值?

我有一个对象数组,其中一些响应:描述,我想从第一个描述得到描述.我能做到这一点:

objects.detect{|o| o.try(:description)}.description
Run Code Online (Sandbox Code Playgroud)

或这个:

objects.map{|o| o.try(:description)}.detect{|o| o}
Run Code Online (Sandbox Code Playgroud)

但第一个不是DRY(描述在那里两次),第二个是在找到值之前遍历整个数组.ruby标准库中有什么东西,或者Rails对它的扩展,这可以让我做这样的事情:

objects.detect_and_return{|o| o.try(:description)}
Run Code Online (Sandbox Code Playgroud)

我知道我可以轻松地编写它,但标准库足够大,我可能不需要.有没有像我这样的功能detect_and_return

ruby functional-programming ruby-on-rails

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

适当的Assert_Raise单元测试和异常类的使用

我正在练习练习49学习Ruby的艰辛之路

练习要求为所提供的每个功能编写单元测试.我正在测试的一个项目是,是否引发了适当的异常.建议我们assert_raise为此目的使用.

这是我正在测试的代码:

class ParserError < Exception

end

Pair = Struct.new(:token, :word)

def peek(word_list)
    begin
        word_list.first.token
    rescue
        nil
    end 
end

def match(word_list, expecting)
    word = word_list.shift
    if word.token == expecting
        word
    else
        nil
    end
end

def skip_word(word_list, token)
    while peek(word_list) == token
        match(word_list, token)
    end
end

def parse_verb(word_list)
    skip_word(word_list, :stop)

    if peek(word_list) == :verb
        return match(word_list, :verb)
    else
        raise ParserError.new("Expected a verb next.")
    end
end
Run Code Online (Sandbox Code Playgroud)

这是测试,对于函数parse_verb:

def test_parse_verb
    list_one = [Pair.new(:verb, 'go'), Pair.new(:noun, 'king')]
    assert_equal(parse_verb(list_one), Pair.new(:verb, 'go')) …
Run Code Online (Sandbox Code Playgroud)

ruby unit-testing assert assertraises learn-ruby-the-hard-way

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

proc可以与Ruby 2.0中的case语句一起使用吗?

我记得case在Ruby 2.0的语句中允许使用procs ,但我不能谷歌.

我尝试检查Ruby 2.0.0 NEWS以及如何在Ruby中编写switch语句.我也访问过http://ruby-doc.org,但它对关键字的链接是针对Ruby 1.9而不是Ruby 2.0.

案件陈述中是否允许过程?

ruby switch-statement ruby-2.0

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