使用Ruby / Rails将嵌套哈希展平为单个哈希

我想在不同深度的哈希中“扁平化”(不是经典意义上的.flatten ),如下所示: { :foo => “bar”, :hello => { :world => “Hello World”, :bro => “What’s up dude?”, }, :a => { :b => { :c => “d” } } } 下到一个单一级别的哈希,并且所有嵌套的键合并为一个字符串,因此它将成为: { :foo => “bar”, :”hello.world” => “Hello World”, :”hello.bro” => “What’s up dude?”, :”abc” => “d” } 但我想不出一个好办法。 它有点像Rails添加到deep_ helper函数,但不完全相同。 我知道递归将是这里的方式,但我从未在Ruby中编写过递归函数。

如何从另一个目录中请求ruby文件

我想要一个我在另一个文件中创建的rake文件。 这两个文件位于两个不同的目录中。 我要求在我的第一个文件的顶部,在require之后的引号内有第二个文件的名称。 它告诉我它无法加载这样的文件。 这是否意味着因为它在不同的目录中找不到它? 我试着坚持第二个文件的完整路径,但它仍然无法加载文件。 有谁知道如何将第二个文件加载到第一个文件中? 提前致谢

+ =和<<之间的Ruby差异以连接字符串

在Ruby 1.8.7上,当发现在String对象上<<和+=之间似乎存在巨大差异时,我正在进行循环连接字符串: y = “” start = Time.now 99999.times { |x| y += “some new string” } puts “Time: #{Time.now – start}” # Time: 31.56718 y=” start = Time.now 99999.times { |x| y << "some new string" } puts "Time: #{Time.now – start}" # Time: 0.018256 我谷歌了解一下,发现了一些结果: http://www.rubylove.info/post/1038516765/difference-between-string-concatenation-ruby-rails 说<<修改两个字符串,而+=只修改调用者。 我不明白为什么然后<<更快。 接下来我去了Ruby doc,但我想知道为什么没有方法+= http://ruby-doc.org/core-2.2.0/String.html

就像Ruby on Rails中的按钮Ajax一样

我有一个Ruby on Rails项目,其中包括模型User和模型Content等。 我希望用户能够“喜欢”一个内容,并且我已经使用acts_as_votable gem完成了这项工作。 目前,喜欢系统正在运行,但每次按下喜欢按钮(link_to)时我都会刷新页面。 我想使用Ajax来做这件事,以便更新按钮和喜欢的计数器,而无需刷新页面。 在我的Content -> Show视图中,这就是我所拥有的: · users like this Content控制器这样做喜欢/不喜欢: def like @content = Content.find(params[:id]) @content.liked_by current_user redirect_to @content end def dislike @content = Content.find(params[:id]) @content.disliked_by current_user redirect_to @content end 在我的routes.rb文件中,这就是我所拥有的: resources :contents do member do put “like”, to: “contents#like” put “dislike”, to: “contents#dislike” end end 正如我所说,喜欢系统工作正常,但在用户按下之后不会更新喜欢的计数器或类似按钮。 相反,为了欺骗它,我在控制器动作中调用redirect_to @content 。 […]

sqlite3 gem无法安装

我正在尝试在OS X 10.6上安装“sqlite3-ruby”gem(或“sqlite3”gem)。 我正在使用ruby-1.9.2,目前我得到以下内容: $ sqlite3 –version 3.7.4 $ sudo gem install sqlite3 Building native extensions. This could take a while… ERROR: Error installing sqlite3-ruby: ERROR: Failed to build gem native extension. /Users/folken/.rvm/rubies/ruby-1.9.2-head/bin/ruby extconf.rb checking for sqlite3.h… *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or […]

Ruby数组减法,不会多次删除项目

Ruby中的规范数组差异示例是: [ 1, 1, 2, 2, 3, 3, 4, 5 ] – [ 1, 2, 4 ] #=> [ 3, 3, 5 ] 取而代之的是获得以下行为的最佳方法是什么? [ 1, 1, 2, 2, 3, 3, 4, 5 ].subtract_once([ 1, 2, 4 ]) #=> [ 1, 2, 3, 3, 5 ] 也就是说,只从第一个数组中删除第二个数组中每个匹配项的第一个实例。

Chrome 62和Flash

我有一个基于Flash的应用程序,我需要使用Cucumber进行测试。 由于默认情况下未启用闪存,因此我需要在每次测试之前启用它,并将我认为的url列入白名单。 如果我暂停测试的后台阶段,我可以手动设置这些选项。 我怎么能自动化这种方法,我已经考虑过添加options和preferences ,但似乎仍然无法开始工作。 所以这是我在env.rb文件中的标准设置 Capybara.register_driver :chrome do |app| chrome_binary = ‘/Applications/Google Chrome.app’ capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(“chromeOptions” => { “binary” => chrome_binary + ‘/Contents/MacOS/Google Chrome’ }) Capybara::Selenium::Driver.new(app, :browser => :chrome, :desired_capabilities => capabilities, :options => options) end 进一步阅读强调了诸如此类的选项 options = Selenium::WebDriver::Chrome::Options.new options.add_argument(‘arg-here’) prefs = {“enable flash here ? “} options.add_experimental_option(“prefs”, prefs) undefined method add_experimental_option for […]

如何避免NoMethodError在嵌套哈希中缺少元素,而不重复nil检查?

我正在寻找一种避免在深层嵌套哈希中检查每个级别的nil的好方法。 例如: name = params[:company][:owner][:name] if params[:company] && params[:company][:owner] && params[:company][:owner][:name] 这需要三次检查,并且会产生非常难看的代码。 有办法解决这个问题吗?

如何解析CSV文件,更新字段,然后保存

我需要读取CSV文件,更新字段,然后保存更改。 除了将更改保存到我正在更新的字段之外,我的一切工作正常: require ‘csv’ @parsed_file = CSV::Reader.parse(File.open(“#{RAILS_ROOT}/doc/some.csv”)) @parsed_file.each_with_index do |row, x| address = row[5] l = Location.address_find(address) if l != nil puts “#{l.name} at #{l.address}” row[14] = l.store_code puts row[14] else puts “No matching address Found!!!” end #What do I do here? Something like this? CSV::Writer.generate(@parsed_file) end 我该怎么办? 如何保存我所做的更改并更新文件?

在Ruby中动态设置局部变量

我有兴趣在Ruby中动态设置局部变量。 不创建方法,常量或实例变量。 所以类似于: args[:a] = 1 args.each_pair do |k,v| Object.make_instance_var k,v end puts a > 1 我特别想要局部变量,因为所讨论的方法存在于模型中,我不想污染全局或对象空间。