小编Nie*_*ian的帖子

机械化:从同一形式的多个提取权

我使用Mechanize循环遍历一个分页的表.

我有一个包含多个提交输入的表单的问题.输入标记用作分页,它们是动态生成的.当我循环浏览需要抓取的页面时,我需要能够选择正确的输入,因为只有其中一个会将我带到"下一页".正确的标签可以通过不同的属性来识别,例如名称,类,价值等.我的问题是,我无法找到如何告诉机械化使用哪一个.

我试过这个:

require 'mechanize'
require 'yaml'

url = "http://www.somewhere.com"

agent = Mechanize.new
page = agent.get(url)

loop do

  puts "some content from site using nokogiri"

  if next_page = page.form_with(:action => /.*/)
    page = next_page.submit(page.form_with(:action => /.*/).submits[3])
  else
    break
  end

end
Run Code Online (Sandbox Code Playgroud)

从这篇文章,http://rubyforge.org/pipermail/mechanize-users/2008-November/000314.html,但正如所说的那样,标签的数量正在发生变化,所以只选择一个硬编码的提交数量并不是一个好主意.

我想知道的是,如果有这样的方式:

loop do

  puts "some content from site using nokogiri"

  if next_page = page.form_with(:action => /.*/)
    page = next_page.submit(:name => /the_right_submit_button/)
  else
    break
  end

end
Run Code Online (Sandbox Code Playgroud)

或类似的东西,可能有一个css或xpath选择器.

ruby mechanize nokogiri

3
推荐指数
1
解决办法
2258
查看次数

内存中关联引用已损坏:save之前的引用父对象返回nil

我有以下两种型号:

class Seller < ActiveRecord::Base
  has_many :cars, :dependent => :destroy
end

class Car < ActiveRecord::Base
  belongs_to :seller
end
Run Code Online (Sandbox Code Playgroud)

现在我需要能够在将对象保存到数据库之前从汽车中引用卖方,这当前不起作用:

seller = Seller.new
=> #<Seller id: nil, name: nil, created_at: nil, updated_at: nil>
seller.cars.build(:brand => 'Audi', :model_name => 'A4')
=> #<Car id: nil, brand: 'Audi', model_name: 'A4', created_at: nil, updated_at: nil>
Run Code Online (Sandbox Code Playgroud)

现在该协会的工作来自卖方,但不是来自汽车方面:

car = seller.cars.first
=> #<Car id: nil, brand: 'Audi', model_name: 'A4', created_at: nil, updated_at: nil>
car.seller
=> nil
Run Code Online (Sandbox Code Playgroud)

如何让关联正常工作?

PS.如上所述,如果我将对象保存到db,那么引用就可以正常工作.

ruby-on-rails associations

3
推荐指数
1
解决办法
426
查看次数

如何访问ActiveModel验证错误的翻译密钥?

我有一种情况,我不想在我的数据库中存储验证错误的翻译密钥,而不是它自己的错误消息.想象一下以下情况:

class Car < ActiveRecord::Base
  validates_presence_of :year, :fuel
end

car = Car.new(:fuel => 'Diesel')
car.save!
#=> ActiveRecord::RecordInvalid
Run Code Online (Sandbox Code Playgroud)

现在,如果我打电话:

car.errors
#=> :year=>["can't be blank"]
Run Code Online (Sandbox Code Playgroud)

我收到翻译的错误消息.

相反,我想提取生成它的翻译键(在这种情况下,我认为它会是这样的errors.messages.blank),所以我可以将它存储在我的数据库中的不同模型中,例如FailedCar我以后可以生成一个I18n自定义表单在视图中手动填写缺失的信息.

UPDATE

我认为这是这个方法,我需要挂接到.我想获取密钥和返回的选项,因此我可以在以后再次执行翻译.

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

3
推荐指数
1
解决办法
1171
查看次数

圆阵列切片

我有一个数组有不同数量的元素0..n元素.一个例子可能是:

a = [0,1,2,3,4,5,6,7,8,9]
Run Code Online (Sandbox Code Playgroud)

在迭代过程中,我想在数组中移动光标并切出最多数量的元素.如果我到达数组的"结尾",它应该重新开始并再次从头开始选择:

像这样的东西:

4.times do |i|
  a.slice(i * 3, 3)
end
# i = 0 => [0,1,2]
# i = 1 => [3,4,5]
# i = 2 => [6,7,8]
# i = 3 => [9,0,1]
# ...
Run Code Online (Sandbox Code Playgroud)

然而最后的输出i = 3产生[9].slice不这样做正是我想要的.

ruby arrays

3
推荐指数
1
解决办法
862
查看次数

rails autoload_paths中的错误?

我在代码中遇到了一个奇怪的错误.我有一个rails应用程序,在lib中有以下两个文件:

LIB/module_one/module_two/class_one.rb

module ModuleOne
  module Moduletwo
    class ClassOne
      class << self
        def test
          puts 'Class one'
          ClassTwo.test
        end
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

LIB/module_one/module_two/class_two.rb

module ModuleOne
  module ModuleTwo
    class ClassTwo
      def self.test
        puts 'Class two'
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,当我进入控制台并写道:

ModuleOne::ModuleTwo::ClassOne.test
Run Code Online (Sandbox Code Playgroud)

它抛出以下内容: NameError: uninitialized constant ClassTwo

奇怪的是,问题似乎与使用class << self而不是相关self.method.如果我像这样更改class_one.rb文件就可以了!

module ModuleOne
  module ModuleTwo
    class ClassOne
      def self.test
        puts 'Class one'
        ClassTwo.test
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我在application.rb中加载文件,如下所示:

config.autoload_paths += %W(#{config.root}/lib)
Run Code Online (Sandbox Code Playgroud)

这是rails中的一个错误,还是只是我弄错了?

我使用rails 3.1.3 btw

ruby-on-rails

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

使用数组中的键和标准值创建哈希

我有这样一个数组:

['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

什么是最简单的方法:

{'a' => true, 'b' => true, 'c' => true}
Run Code Online (Sandbox Code Playgroud)

true 只是值应该保持的标准值.

ruby

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

很多:`require':无法加载这样的文件 - 升级ruby/rails后的"gem_name"(LoadError)

在我刚刚从4.1升级rails并将ruby从2.0升级到2.1之后,当我尝试启动rails时,我遇到了几个加载问题.我的很多宝石都会抛出这样的错误:

/Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require': cannot load such file -- jwt (LoadError)
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `block in require'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:232:in `load_dependency'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/oauth2-1.0.0/lib/oauth2/strategy/assertion.rb:1:in `<top (required)>'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `block in require'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:232:in `load_dependency'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/oauth2-1.0.0/lib/oauth2.rb:8:in `<top (required)>'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `block in require'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:232:in `load_dependency'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/omniauth-oauth2-1.2.0/lib/omniauth/strategies/oauth2.rb:1:in `<top (required)>'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `block in require'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:232:in `load_dependency'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
  from /Users/nk/.rvm/gems/ruby-2.1.3@au_rails4/gems/omniauth-facebook-2.0.0/lib/omniauth/strategies/facebook.rb:1:in `<top (required)>'
  from …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails upgrade ruby-on-rails-4

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

正则表达式与单词中的utf8字符不匹配(\ w +)

为什么以下代码返回nil:

'The name of the city is: Ørbæk'.match(/:\s\w+/)
#=> nil
Run Code Online (Sandbox Code Playgroud)

当我期望它回归 "Ørbæk"

我已经尝试#encoding=utf-8在文档的开头设置,但它不会改变任何东西.

PS.Ø和Æ是丹麦字母

ruby regex ruby-on-rails

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

为什么可以改变冻结常数?

为什么可以执行以下操作?我不指望它.

CAD={:hey => {a: [1], b: [2]}}.freeze
CAD.frozen?     #=> true 
p=CAD[:hey][:a] #=> [1] 
p << nil        #=> [1, nil] 
CAD             #=> {:hey=>{:a=>[1, nil], :b=>[2]}}
Run Code Online (Sandbox Code Playgroud)

UPDATE

我找到了一个解决方案,感谢答案:http://blog.flavorjon.es/2008/08/freezing-deep-ruby-data-structures.html

ruby

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

关闭水豚的正确方法(与恶作剧者/幻影者)

我在linux服务器上通过capybara跑了很多工作.我正在使用poltergeist phantomjs驱动程序.过了一会儿,我收到了很多这样的错误:

Errno::EMFILE Too many open files - socket(2)
Run Code Online (Sandbox Code Playgroud)

我看了看,lsof看起来我有很多这些:

ruby      32316   deployer  320u     IPv4  9893211        0t0      TCP localhost:55062 (LISTEN)
Run Code Online (Sandbox Code Playgroud)

现在我怀疑它可能是因为我没有正确关闭连接?

运行类似以下内容后终止的正确方法是什么:

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, {:js_errors => false})
end

Capybara.current_driver = :poltergeist
Capybara.javascript_driver = :poltergeist
Capybara.run_server = false

@session = Capybara::Session.new(:poltergeist)
@session.visit('some_url')
Run Code Online (Sandbox Code Playgroud)

ruby tcp capybara phantomjs poltergeist

0
推荐指数
1
解决办法
2456
查看次数

匹配所有控制字符,但换行符\n

有没有办法编写一个匹配除换行符之外的任何控制字符的正则表达式"\n"

我可以编写一个正则表达式来捕获任何控制字符,如下所示:

/\p{Cc}/
Run Code Online (Sandbox Code Playgroud)

ruby regex

0
推荐指数
1
解决办法
94
查看次数