0

Nokogiri はコンソールでは問題なく動作しますが、Model、View、または Controller のどこにでも配置すると、タイムアウトします。

2つの方法のうちの1つを使用したいのですが...

コントローラ

def show
  @design = Design.find(params[:id])
  doc = Nokogiri::HTML(open(design_url(@design)))
  images = doc.css('.well img') ? doc.css('.well img').map{ |i| i['src'] } : []
end

また...

モデル

def first_image
  doc = Nokogiri::HTML(open("http://localhost:3000/blog/#{self.id}"))
  image = doc.css('.well img')[0] ? doc.css('.well img')[0]['src'] : nil
  self.update_attribute(:photo_url, image)
end

どちらもタイムアウトになりますが、コンソールでは完全に機能します。

4

3 に答える 3

1

タイムアウトのデフォルト値がわかりません。ただし、以下のようにタイムアウト値を指定できます。

require 'net/http'

http = Net::HTTP.new('localhost')
http.open_timeout = 100
http.read_timeout = 100
Nokogiri.parse(http.get("/blog/#{self.id}").body)

最後に、タイムアウト値を制御できるため、何が問題なのかを見つけることができます。

于 2013-10-04T20:42:44.937 に答える
-1

それで、タイラーのアドバイスで、私は自分がしていたことをもう少し掘り下げました. ckeditor が画像と接続していないため、carrierwave と S3 が原因で、アップローダーから直接情報を取得できません (少なくとも、私にはそう見えます)。

代わりに、ノコギリにこだわっていますが、素晴らしく機能しています。コマンドで実際に行っていたことに気づきましたがopen()、それはまったく不要でした。Nokogiri は HTML を解析します。@design.content!の形式で HTML を指定できます。ええと、私の側では。

だから、これは私が自分のサイトをスクレイピングして、ブログエントリに関連付けられた画像を取得する方法です:

design_controller.rb

def create
  params[:design][:photo_url] = Nokogiri::HTML(params[:design][:content]).css('img').map{ |i| i['src']}[0]
  @design = Design.new(params[:design])
  if @design.save
    flash[:success] = "Design created"
    redirect_to designs_url
  else
    render 'designs/new'
  end
end

def show
  @design = Design.find(params[:id])
  @categories = @design.categories
  @tags = @categories.map {|c| c.name}
  @related = Design.joins(:categories).where('categories.name' => @tags).reject {|d| d.id == @design.id}.uniq
  set_meta_tags og: {
    title: @design.name,
    type: 'article',
    url: design_url(@design),
    image: Nokogiri::HTML(@design.content).css('img').map{ |i| i['src']},
    article: {
      published_time: @design.published_at.to_datetime,
      modified_time: @design.updated_at.to_datetime,
      author: 'Alphabetic Design',
      section: 'Designs',
      tag: @tags
    }
  }
end

Update アクションには、Create アクションと同じ Nokogiri のコードがあります。

今見ても一目瞭然です(笑)。私はこれについて、認めたくないほど長く考えました...

于 2013-10-09T08:59:48.907 に答える