方法调用中的错误未定义方法通过按索引页面上的引导按钮Rails 4

时间:2014-11-07 07:59:16

标签: ruby twitter-bootstrap ruby-on-rails-4 nokogiri typhoeus

我需要调用方法download_images(" \ folder"," http:\ url"),它们会从选择目录中的url中保存图片。这个方法应该在index.html中调用按下button1后,.erb并从textbox1获取文件夹地址,从textbox2获取url。


现在我不知道如何从文本框中获取字符串,我正在尝试正确调用方法index.html.erb代码:



<h1>Welcome#index</h1>

<p><%=  "Download pictures from url!" %></p>
   
<div class="form-horizontal">
  <p> Input url: </p>
  <p> <input type="text"/> </p>
  <p> Input destination folder: </p>
  <p> <input type="text"/> </p>
    <button class="btn">Go!</button>
  <% button_to "btn", :method=> download_images("`/tutorial1/downloadedpics","http://www.yandex.ru/") %>
</div>
&#13;
&#13;
&#13;


我在welcome_controller.rb中定义了方法download_images:

&#13;
&#13;
class WelcomeController < ApplicationController
  def index
  end

  def download_images(url, destination_path, options = {})
    base_url = URI.join(url, "/").to_s
    body = Typhoeus::Request.get(url).body
    imgs = Nokogiri::HTML(body).css("img")
    image_srcs = imgs.map { |img| img["src"] }.compact.uniq

    hydra = Typhoeus::Hydra.new(:max_concurrency => options[:max_concurrency] || 50)
    image_paths = image_srcs.map do |image_src|
      image_url = URI.join(base_url, image_src).to_s
      path = File.join(destination_path, File.basename(image_url))
      request = Typhoeus::Request.new(image_url)
      request.on_complete { |response| File.write(path, response.body) }
      hydra.queue(request)
      path
    end
    hydra.run
    image_paths
  end

  
end
&#13;
&#13;
&#13;

切换服务器并转到localhost后,我收到一个异常:  Welcome#index中的NoMethodError,未定义方法download_images' for #<#<Class:0x007f202fc3ae50>:0x007f202f9ab518>, in line <% button_to "btn", :method=> download_images(" / tutorial1 / downloadedpics&#34;,&#34; http://www.yandex.ru/&#34;)%&gt;

我是一个菜鸟程序员,所以我可以做一些愚蠢的错误...... 值得一提的是:我在Nitrous网站上工作,并不知道是否可以在盒子文件夹中下载图像:

  

〜/教程1 / downloadedpics

我也使用Bootstrap控制器,Nokogiri gem和Typhoeus gem Ruby版本:ruby 2.1.1p76 Rails版本:Rails 4.1.0 谢谢你的关注。

1 个答案:

答案 0 :(得分:0)

作为一个FYI,做:

imgs = Nokogiri::HTML(body).css("img")
image_srcs = imgs.map { |img| img["src"] }.compact.uniq

不是使用“src”参数查找图像的正确方法。因为您搜索不正确,所以在结果数组中会出现nils,迫使您使用compact。相反,在制造混乱之后不要依赖清理,只是避免在第一时间制造混乱:

require 'nokogiri'

body = <<EOT
<html>
<body>
  <img>
  <img src="foo">
</body>
</html>
EOT

imgs = Nokogiri::HTML(body).css("img[@src]")
image_srcs = imgs.map { |img| img["src"] }
image_srcs # => ["foo"]