在我的模型方法中创建函数不适用于我的rails 5应用程序

时间:2017-03-15 19:27:39

标签: ruby-on-rails ruby

我有一个应用程序,它使用我编写的派对代码,位于我的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 `

我可能做错了什么?

2 个答案:

答案 0 :(得分:1)

因为它说:回滚事务,这肯定意味着该模型无效,您将要创建。

有多种方法可以解决此问题:您可以使用byebug调试代码,并检查plag.errors.full_messages其中plag是否为实例。

您也可以使用create!代替create,因为如果模型值不是有效值,方法create!将抛出异常。

答案 1 :(得分:0)

这是您控制台的代码。 如果您注意到,当您在控制台中调用该方法时,它会执行查询以创建对象并尝试将其保存到数据库中。正如我们在聊天中讨论的那样,最后两个字段user_iddoc_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