小编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
查看次数

块定义 - 大括号和do-end之间的区别?

任何人都可以解释为什么以下代码中止错误

irb(main):186:0> print ((1..10).collect do |x| x**2 end)
SyntaxError: (irb):186: syntax error, unexpected keyword_do_block,
expecting ')'
print ((1..10).collect do |x| x**2 end)
                         ^
(irb):186: syntax error, unexpected keyword_end, expecting $end
print ((1..10).collect do |x| x**2 end)
                                      ^
        from /usr/bin/irb:12:in `<main>'
Run Code Online (Sandbox Code Playgroud)

而具有相同功能的以下代码是否按预期工作?

irb(main):187:0> print ((1..10).collect { |x| x**2 })
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]=> nil
Run Code Online (Sandbox Code Playgroud)

我确实认为花括号"{}"可以在块定义中任意替换"do end".

我知道我可以通过省略print方法和第一个括号之间的空格来"修复"第一个调用,但我对解释它为什么表现不同感兴趣 .

ruby block

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

如何要求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
查看次数

在Ruby中访问类中的模块类变量

我有一个带有类变量的模块

module Abc
  @@variable = "huhu"

  def self.get_variable
    @@variable
  end

  class Hello
    def hola
      puts Abc.get_variable
    end
  end
end

a = Abc::Hello.new
a.hola
Run Code Online (Sandbox Code Playgroud)

是否可以不使用方法进入@@variable内部?我的意思是说会很好.只是好奇.Helloget_variableAbc.variable

ruby accessor class-variables

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

是否有惯用的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
查看次数

为什么String#gsub会双重内容?

s = "#main= 'quotes'
s.gsub "'", "\\'" # => "#main= quotes'quotes"
Run Code Online (Sandbox Code Playgroud)

这似乎是错误的,我希望得到 "#main= \\'quotes\\'"

当我不使用转义字符时,它按预期工作.

s.gsub "'", "*" # => "#main= *quotes*"
Run Code Online (Sandbox Code Playgroud)

所以必须与逃避有关.

使用ruby 1.9.2p290

我需要用反斜杠和引号替换单引号.

更多的不一致:

"\\'".length # => 2
"\\*".length # => 2

# As expected
"'".gsub("'", "\\*").length # => 2
"'a'".gsub("'", "\\*") # => "\\*a\\*" (length==5)

# WTF next:
"'".gsub("'", "\\'").length # => 0

# Doubling the content?
"'a'".gsub("'", "\\'") # => "a'a" (length==3)
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

ruby regex ruby-on-rails gsub

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

为什么我得到无法找到任何来源的multi_json-1.3.1?

我有一个简单的Rails应用程序,我想部署到Heroku.当我运行以下命令

git push heroku master
Run Code Online (Sandbox Code Playgroud)

显示以下错误消息.

 Could not find multi_json-1.3.1 in any of the sources
 !
 ! Failed to install gems via Bundler.
 !
 ! Heroku push rejected, failed to compile Ruby/rails app
Run Code Online (Sandbox Code Playgroud)

这是我的Gemfile

 gem 'rails', '3.2.3'
 gem 'pg'
 group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'
  gem 'therubyracer', :platform => :ruby
  gem 'uglifier', '>= 1.0.3'
end
gem 'jquery-rails'
Run Code Online (Sandbox Code Playgroud)

deployment ruby-on-rails heroku bundler ruby-on-rails-3

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

rubocop在html.erb文件中?

我很好奇是否有办法制作Rubocop lint/stylecop html.erb文件?我意识到html会使嵌入式Ruby的样式变得困难.有没有人能够让Rubocop这样做?如果没有,是否有用于此目的的等效工具?我使用过rails_best_practices,并没有按照预期的那样工作.

static-analysis ruby-on-rails erb rubocop

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