标签: ruby

我应该在我的Gemfile中指定确切的版本吗?

我注意到在rubygems.org上有很多宝石建议你用主要版本而不是精确版本来指定它们.例如...

haml-rails宝石 ......

gem "haml-rails", "~> 0.3.4"  # "$ bundle install" will acquire the 
                              # latest version before 1.0.
Run Code Online (Sandbox Code Playgroud)

然而,根据Bundler文档,它听起来像我最好确定这样的确切版本...

gem "haml-rails", "0.3.4"
Run Code Online (Sandbox Code Playgroud)

所以你的haml-rails gem和它的所有依赖都不会向前发展.如果您在几周之后在另一台机器上检查项目并运行,$ bundle install那么您将拥有与您指定的所有内容完全相同的版本.

我已经看到点发布破坏了东西,我认为Bundler的整个想法的一部分是" Bundle.lock"你所有的宝石版本.

但是在rubygems.org上他们使用"〜>"很多,所以也许我错过了什么?

任何澄清对我理解Bundler和gem管理都非常有帮助.

ruby rubygems ruby-on-rails bundler ruby-on-rails-3

64
推荐指数
3
解决办法
3万
查看次数

nokogiri宝石安装错误

我知道有很多关于这个宝石的问题,但没有答案对我有用.

当我在SSH中运行时,gem install nokogiri我收到此错误:

Extracting libxml2-2.8.0.tar.gz into tmp/x86_64-unknown-linux-gnu/ports/libxml2/2.8.0... OK
Running patch with /home/user58952277/.gem/ruby/1.9.3/gems/nokogiri-1.6.2.1/ports/patches/libxml2/0001-Fix-parser-local-buffers-size-problems.patch...
Running 'patch' for libxml2 2.8.0... ERROR, review 'tmp/x86_64-unknown-linux-gnu/ports/libxml2/2.8.0/patch.log' to see what happened.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.
Run Code Online (Sandbox Code Playgroud)

我的主人告诉我所有lib都已安装.以下是执行install nokogiri命令后的完整日志:

Building native extensions.  This could take a while...
Building nokogiri using packaged libraries.
Building libxml2-2.8.0 for nokogiri with the following …
Run Code Online (Sandbox Code Playgroud)

ruby macos rubygems ruby-on-rails nokogiri

64
推荐指数
4
解决办法
4万
查看次数

"<%= h [...]%>"中"h"的含义是什么?

当我生成默认支架时,show.html.erb上的显示标签有

<%=h @broker.name %>
Run Code Online (Sandbox Code Playgroud)

我知道之间的区别<%<%=.什么是"h"呢?

ruby templates ruby-on-rails

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

如何在Ruby中将时间缩短到最近的15分钟?

有一种简单的方法可以将时间缩短到最近的15分钟吗?

这就是我目前正在做的事情.有更简单的方法吗?

t = Time.new
rounded_t = Time.local(t.year, t.month, t.day, t.hour, t.min/15*15)
Run Code Online (Sandbox Code Playgroud)

ruby

63
推荐指数
8
解决办法
3万
查看次数

常见的Ruby习语

我喜欢ruby的一件事是,它主要是一种非常易读的语言(非常适合自我记录的代码)

然而,受到这个问题的启发:Ruby Code解释 并描述了如何||=在ruby中工作,我正在考虑我不使用的ruby习语,坦率地说,我并没有完全理解它们.

所以我的问题是,类似于引用问题的例子,我需要注意哪些常见但不明显的红宝石成语才能成为一名真正熟练的红宝石程序员?

顺便说一句,从引用的问题

a ||= b 
Run Code Online (Sandbox Code Playgroud)

相当于

if a == nil || a == false
  a = b
end
Run Code Online (Sandbox Code Playgroud)

(感谢Ian Terrell的更正)

编辑:事实证明,这一点并非完全没有争议.事实上正确的扩张

(a || (a = (b))) 
Run Code Online (Sandbox Code Playgroud)

请参阅以下链接了解原因:

感谢JörgWMittag指出这一点.

ruby idioms

63
推荐指数
7
解决办法
2万
查看次数

如何在请求规范中存根ApplicationController方法

我需要current_user在Rspec/capybara请求规范中存根方法的响应.该方法在ApplicationControllerhelper_method中定义并使用helper_method.该方法应该只返回一个用户ID.在测试中,我希望这种方法每次都返回相同的用户ID.

或者,我可以通过设置session[:user_id]规范(这是什么current_user返回)来解决我的问题...但这似乎也不起作用.

这些都可能吗?

编辑:

这是我得到的(它不工作.它只运行正常的current_user方法).

require 'spec_helper'

describe "Login" do

   before(:each) do
     ApplicationController.stub(:current_user).and_return(User.first)
   end

  it "logs in" do
    visit '/'
    page.should have_content("Hey there user!")
  end

end
Run Code Online (Sandbox Code Playgroud)

也不工作:

require 'spec_helper'

describe "Login" do

  before(:each) do
    @mock_controller = mock("ApplicationController") 
    @mock_controller.stub(:current_user).and_return(User.first)
  end

  it "logs in" do
    visit '/'
    page.should have_content("Hey there user!")
  end

end
Run Code Online (Sandbox Code Playgroud)

ruby rspec ruby-on-rails capybara

63
推荐指数
2
解决办法
3万
查看次数

Ruby JSON解析改变了Hash密钥

让我们说我有这个哈希:

{
  :info => [
    {
        :from => "Ryan Bates",
        :message => "sup bra",
        :time => "04:35 AM"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我可以通过这样做来调用info数组hash[:info].

现在当我把它变成JSON(JSON.generate),然后解析它(JSON.parse)时,我得到这个哈希:

{
  "info" => [
    {
        "from" => "Ryan Bates",
        "message" => "sup bra",
        "time" => "04:35 AM"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我使用hash[:info]它返回nil,但如果我使用它hash["info"].

为什么是这样?无论如何都要修复这种不兼容性(除了从头开始使用字符串键)?

ruby hash json ruby-on-rails

63
推荐指数
3
解决办法
4万
查看次数

烦人的"警告:已经初始化的常量"消息的解决方案

今天我偶然发现了Ruby常量的棘手问题.在我们的团队中,有人创建了一个模块,该模块包含在多个模型中.在我们的(规范)测试输出中,这会产生警告消息,例如:

/home/ayrton/project/lib/life_cycle.rb:5:警告:已初始化常量RESET

解决这个问题的一种方法是,声明你的常量如下:

module LifeCycle

  unless (const_defined?(:RESET))
    RESET = 'reset'
  end

  #...
end
Run Code Online (Sandbox Code Playgroud)

我还阅读了一篇由Avdi Grimm撰写的博客文章,该文章提供了另一种解决方案,我想知道你对此事的看法.

ruby constants

63
推荐指数
3
解决办法
4万
查看次数

即使存在未设置为true,Rails验证也需要数值

我正在尝试保存一个没有一个字段集的记录 - 它在模型中具有验证数字.即使验证中不需要存在,它仍然会抛出该字段不是数字的错误.

验证:

validates :network_id,    :numericality => true
Run Code Online (Sandbox Code Playgroud)

代码就是保存模型:

networks.each do |network|
  network.url = network.raw_data.link
  network.save!
end
Run Code Online (Sandbox Code Playgroud)

错误:

Validation failed: Network is not a number
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails ruby-on-rails-3

63
推荐指数
4
解决办法
3万
查看次数

JSON文本必须至少包含两个八位字节

我收到了这个错误,我找不到任何合理的答案,所以我想我会写一个问题的摘要.

如果您在irb中运行此代码段:

JSON.parse( nil )
Run Code Online (Sandbox Code Playgroud)

您将看到以下错误:

TypeError: can't convert nil into String
Run Code Online (Sandbox Code Playgroud)

我有点期待函数返回nil,而不是TypeError.如果您使用转换所有输入to_s,那么您将看到八位字节错误:

JSON::ParserError: A JSON text must at least contain two octets!
Run Code Online (Sandbox Code Playgroud)

那很好,很好.如果你不知道八位字节是什么,请阅读这篇文章以获得摘要和解决方案: 什么是JSON八位字节,为什么需要两个?

您传入的变量是一个空字符串.不要尝试在JSON.parse方法中使用空字符串.

所以,现在我知道错误的原因,我应该使用什么模式来处理这个问题?我有点厌恶修补JSON库以允许nil值.任何建议将不胜感激.

ruby json ruby-on-rails irb

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