我有一个应用程序,它使用我编写的派对代码,位于我的rails应用程序的lib目录中。代码生成的数据应该生成应该保存到数据库的数据,但是当创建时函数被触发它触发nil结果...代码从rails控制台运行时代码中的错误如下所示:
2.3.3 :004 > Plag.scrap('http://watabelabs.com')
scrapping http://watabelabs.com for data...
crawling the web...
(0.1ms) begin transaction
(0.1ms) rollback transaction
=> #<Plag id: nil, created_at: nil, updated_at: nil, url: "http://watabelabs.com", content: "How can we help?", filename: "watabelabs_com.txt", user_id: nil, doc_id: nil>
2.3.3 :005 > Plag.all
Plag Load (0.3ms) SELECT "plags".* FROM "plags"
=> #<ActiveRecord::Relation []>
2.3.3 :006 > Plag.count
(0.2ms) SELECT COUNT(*) FROM "plags"
=> 0
我模型中的代码是:
def self.scrap(url)
result = @anemon.scrap(url)
Plag.create({url: result[:url], content: result[:content], filename: result[:filename]}) if result
end
我的lib目录中生成要存储在db中的数据的代码是: `def crawl_and_scrap(url)
filename = url.gsub("http://", "").split(".").join("_").strip + ".txt"
#crawl the web to get information out web pages
puts "crawling the web..."
Anemone.crawl(url) do |anemone|
anemone.on_every_page do |page|
@urls = []
@urls << page.url
end
end
#feed in the urls obtained from the crawl to start scrapping
puts "scrapping #{url} for data..."
data = []
@urls.each do |urli|
html_data = open(urli).read
nokogiri_object = Nokogiri::HTML(html_data)
elements = nokogiri_object.xpath("//p","//h1","//h2","//h3","//h4","//h5","//h6")
elements.each do |element|
data << element.text
end
end
write_to_file(url, data)
#store_visited_link(url)
# in ruby the last statement in a method is always the returned value
# of the particular method
{:url => url, :content => data , :filename => filename}
end `
我可能做错了什么?
答案 0 :(得分:1)
因为它说:回滚事务,这肯定意味着该模型无效,您将要创建。
有多种方法可以解决此问题:您可以使用byebug调试代码,并检查plag.errors.full_messages
其中plag
是否为实例。
您也可以使用create!
代替create
,因为如果模型值不是有效值,方法create!
将抛出异常。
答案 1 :(得分:0)
这是您控制台的代码。
如果您注意到,当您在控制台中调用该方法时,它会执行查询以创建对象并尝试将其保存到数据库中。正如我们在聊天中讨论的那样,最后两个字段user_id
和doc_id
都是空的。
<Plag id: nil, created_at: nil, updated_at: nil, url: "http://watabelabs.com", content: "How can we help?", filename: "watabelabs_com.txt", user_id: nil, doc_id: nil>
这是方法。该方法保存result
方法的.scrap()
,并使用result
变量作为Plag.create()
的输入。
如果您在Plag.create()
处观看,则会遗漏两个参数result[:user_id]
和result[:doc_id]
。我之所以这样说,是因为它使用了与result[:url]
相同的参数,其中包含内容等等result[:content]
。
您需要设置如下所示的断点并检查结果变体,以便您可以正确地提供Plag.create
。
def self.scrap(url)
result = @anemon.scrap(url)
binding.pry # inspect the result variant
Plag.create({url: result[:url], content: result[:content], filename: result[:filename]}) if result
end
我引用了文档
与页面交互
Anemone在标记的HREF属性中找到的任何URL都被视为页面,并由Page类的实例表示。页面可能不是HTML文档;它可以是RSS提要,图像等。
每个Page对象都存储了几条信息:
url - The URL of the page
aliases - Other URLs that redirected to this page, or the Page that this one redirects to
headers - The full HTTP response headers
code - The HTTP response code (e.g. 200, 301, 404)
body - The raw HTTP response body
doc - A Nokogiri::HTML::Document of the page body (if applicable)
links - An Array of all the URLs found on the page that point to the same domain
为方便起见,每个页面还有一个数据属性,这是一个OpenStruct,用于存储您希望与页面关联的任何数据,例如标题,元描述等。
以下是使用Anemone打印网站上所有页面标题的排序列表的示例:
Anemone.crawl("http://www.example.com/") do |anemone|
titles = []
anemone.on_every_page { |page| titles.push page.doc.at('title').inner_html rescue nil }
anemone.after_crawl { puts titles.compact.sort }
end