Keo*_*eon 1 ruby ruby-on-rails nokogiri rake-task
我在尝试使用Nokogiri运行rake任务时遇到此错误.
这是代码.
namespace :tops do
desc "Get Tops Description"
task get_description: :environment do
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::HTML(open("http://ceratoboutique.com/collections/tops"))
price = Array.new
items = Array.new
brands = Array.new
sale_price = Array.new
image = Array.new
item_url = Array.new
price = doc.xpath("//del").collect {|node| node.text.strip}
items = doc.xpath("//div/a/h4").collect {|node| node.text.strip}
brands = doc.xpath("//span[contains(@class,'vendor')]").collect {|node| node.text.strip}
sale_price = doc.xpath("//span[contains(@class, 'price')]/text()").collect {|node| node.text.strip}
image = doc.xpath("/div/a/img/@src").collect {|node| node.text.strip}
item_url = doc.css('div.details a').map { |link| link['href'] }.collect
price.each do |prices|
Tops.create(description: price)
end
end
end
Run Code Online (Sandbox Code Playgroud)
这是完整的错误.
耙子流产!TypeError:无法将数组转换为字符串/Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/quoting.rb:76:in
type_cast' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/connection_adapters/sqlite3_adapter.rb:261:intype_cast'/ Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/connection_adapters/sqlite3_adapter.rb:295:inblock in exec_query' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/connection_adapters/sqlite3_adapter.rb:294:inmap' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/ active_record/connection_adapters/sqlite3_adapter.rb:294:在exec_query' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/database_statements.rb:68:inexec_insert'/ Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/database_statements.rb :95 :ininsert' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/query_cache.rb:14:ininsert'/ Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/relation.rb:64:ininsert' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/persistence.rb:502:in_create_record'/ Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/ lib/active_record/attribute_methods/dirty.rb:87:_create_record' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/callbacks.rb:306:in在_create_record'/run_callbacks' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/callbacks.rb:306:inLibrary /Ruby/Gems/2.0.0/gems/activesupport-4.1.5/lib/active_support/callbacks.rb:82: in _create_record'/ 中的 块中 Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/timestamp.rb:57:in_create_record' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/persistence.rb:482:increate_or_update'/ Library/Ruby/Gems/2.0.0/ge ms/activerecord-4.1.5/lib/active_record/callbacks.rb:302:inblock in create_or_update' /Library/Ruby/Gems/2.0.0/gems/activesupport-4.1.5/lib/active_support/callbacks.rb:82:inrun_callbacks'/Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/callbacks.rb:302 :在create_or_update' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/persistence.rb:103:insave'/save' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/attribute_methods/dirty.rb:21:inLibrary/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/validations.rb:51: in save'/ Library/Ruby/Gems/2.0.0/gems/activerecord- 4.1.5/lib/active_record/transactions.rb:268:block (2 levels) in save' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/transactions.rb:329:inwith_transaction_returning_status'/Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/database_statements.rb中的块: 201:inblock in transaction' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/database_statements.rb:209:inwithin_new_transaction'/Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/database_statements.rb :201:in transaction'/ Library/Ruby/Gems/2.0transaction' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/transactions.rb:208:in. 0/gems/activerecord-4.1.5/lib/active_record/transactions.rb:326:with_transaction_returning_status' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/transactions.rb:268:in保存块中的/'Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/transactions . rb:283:在rollback_active_record_state!' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/transactions.rb:267:in'/Library/Ruby/Gems/2.0.0/gems/activerecord-4.1.5/lib/active_record/persistence.rb:34:increate' /Users/Kcummings/Sites/rvm_tests/lib/tasks/tops.rake:24:in块(3级)in'/ Use rs/Kcummings/Sites/rvm_tests/lib/tasks/tops.rake:23:each' /Users/Kcummings/Sites/rvm_tests/lib/tasks/tops.rake:23:in在'/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/task 中的块(2级) .rb:240:在call' /Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/task.rb:240:in执行'/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/task.rb:235:ineach' /Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/task.rb:235:inexecute'/ Library/ Ruby /Gems/2.0 中的 块中 .0/gems/rake-10.3.2/lib/rake/task.rb:179:inblock in invoke_with_call_chain' /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/monitor.rb:211:inmon_synchronize'/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/task.rb :172:在top_level'/ Library/Ruby/Gems 中invoke_with_call_chain' /Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/task.rb:165:in调用'/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:150:ininvoke_task' /Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:106:in块(2级) /2.0.0/gems/rake-10.3.2/lib/rake/application.rb:106:in top_level中的each' /Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:106:in块'/Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake /application.rb:115:inrun_with_threads' /Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:100:intop_level'/ Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:78:inblock in run' /Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/lib/rake/application.rb:176:instandard_exception_handling'/ Library/Ruby/Gems/2.0 .0/gems/rake-10.3.2/lib/rake/application.rb:75:inrun' /Library/Ruby/Gems/2.0.0/gems/rake-10.3.2/bin/rake:33:in'/ usr/bin/rake:23:inload' /usr/bin/rake:23:in'
编辑:TOPS TABLE SCHEMA
ActiveRecord::Schema.define(version: 20140824150641) do
create_table "tops", force: true do |t|
t.string "brand"
t.string "description"
t.string "image"
t.decimal "price"
t.datetime "created_at"
t.datetime "updated_at"
t.string "url"
end
end
Run Code Online (Sandbox Code Playgroud)
似乎你description在表中tops有'varchar' 字段,或者string你试图在其中存储数组.
在尝试存储之前,您需要将description字段的数据类型更改为text然后更改serialize值.
生成新的迁移文件并运行它,在您的终端上:
rails g migration change_desc_in_my_tops
Run Code Online (Sandbox Code Playgroud)
在使用Rails 4时,在迁移文件中添加以下代码:
class ChangeDescInTops < ActiveRecord::Migration
def up
change_column :tops, :description, :text
end
def down
change_column :tops, :description, :string
end
end
Run Code Online (Sandbox Code Playgroud)
现在运行迁移:
rake db:migrate
Run Code Online (Sandbox Code Playgroud)
将您的tops模型更新为:
class Tops < ActiveModel::Base
serialize :description, Array
...
...
end
Run Code Online (Sandbox Code Playgroud)
现在尝试运行你的rake任务.希望,它会帮助你.
注意:您应该使用单一的模型名称.你的Tops模型可能是Top.它避免了使用关联时的混淆,它遵循惯例.
| 归档时间: |
|
| 查看次数: |
5518 次 |
| 最近记录: |