在模型中使用Nokogiri时出错

问题描述 投票:1回答:1

我正在尝试开发一种模型方法,该方法将从发送请求中获取来自控制器的URL。虽然我能够从控制器成功使用Nokogiri,但当我尝试将逻辑移入模型时,我总是得到错误:

Errno :: ENOENT:没有这样的文件或目录@ rb_sysopen - “www.url.com”

为什么Rails不允许我在模型中实现Nokogiri?

The model method I have setup as:

require 'nokogiri'
require 'open-uri'

class UrlContent < ApplicationRecord
    validates :content, presence: true

    def self.parser(url)
        binding.pry
        html = open(url)
        doc = Nokogiri::HTML(html)
        content = doc.css('h1, h2, h3, a').map(&:text).join(" ")
        content
    end 

end

我的控制器看起来像:

require 'nokogiri'
require 'open-uri'

class UrlContentsController < ApplicationController

skip_before_filter :verify_authenticity_token  


    def create
        content = UrlContent.parser(params[:content])
        binding.pry
        render layout: false
    end 

    def index
        @url_contents = UrlContent.all
        render json: @url_contents, status: 200, layout: false
    end

end
ruby-on-rails nokogiri
1个回答
3
投票

看起来你正在用你认为是URL的东西调用open但实际上并非如此。你这样说:

html = open(url)

而且你得到一个关于open无法找到名为'www.url.com'的文件的投诉,所以你实际上在说:

html = open('www.url.com')

当你的意思更像是:

html = open('http://www.url.com')

您应该检查您的URL并添加方案(如果他们还没有)。我通常使用Addressable来做这类事情,如下所示:

uri = Addressable::URI.parse(url)
url = "http://#{url}" if(!uri.scheme)
© www.soinside.com 2019 - 2024. All rights reserved.