1

我正在尝试创建一个提交按钮,该按钮将调用 ruby​​ 脚本并执行它(该脚本采用 isbn 并 ping 第三方站点并根据输入返回信息)。具体来说,我有一个用于创建新书的表单,我需要用户提供的主要字段是 isbn。提交后,我想使用那个 isbn 并运行我的 ruby​​ 脚本来检索数据并将其显示在下一页上。我尝试将 .rb 代码转移到辅助方法中,但我不确定我是否做得对,我不知道如何更改提交按钮的功能以执行任一方法或脚本 这是我的辅助方法

module PagesHelper
require 'httpclient'
require 'nokogiri'
def search(hash)

#class SearchBook

#def initialize(isbn)
# @isbn = isbn
#end  


#puts "Enter ISBN: "
#isbn = gets.chomp
#def run
isbn = hash

conditions = ['Acceptable', 'BrandNew', 'Good', 'LikeNew', 'VeryGood']
client = HTTPClient.new
uri = 'https://svcs.ebay.com/services/half/HalfFindingService/v1?OPERATION-    NAME=findHalfItems&REST-PAYLOAD'

count=0
conditions.each do |condition|

query = {
        'X-EBAY-SOA-SERVICE-NAME' => 'HalfFindingService',
        'SERVICE-VERSION' => '1.0.0',
        'GLOBAL-ID' => 'EBAY-US',
        'X-EBAY-SOA-SECURITY-APPNAME' => 'Compassi-3b25-406b-b3d6-d69ca7353053',
        'RESPONSE-DATA-FORMAT' => 'XML',
        'productID' => isbn,
        'productID.@type' => 'ISBN',
        'itemFilter' => 'Condition',
        'itemFilter.name' => 'Condition',
        'itemFilter.value' => condition,
        'paginationInput.entriesPerPage' => '3',
        'sortBy' => 'FixedPrice',
        'sortBy.sortOn' => 'FixedPrice',
        'sortBy.sortOrder' => 'INCREASING'
        }

  results = client.get_content(uri, query)
  count += 1
  doc = Nokogiri::XML.parse(results)

  if count <= 1
    puts "Book Details"
    puts "--Title: "+doc.css("title").text
    puts "--Author: "+doc.css("nameValueList/value").text
    puts "Prices by Condition:"
  end

  puts "Condition: #{condition}"
  prices = doc.css("price")
  prices.each do |price|
    puts "$#{price.text}"
  end

end

#return count

#end

#end

end
end

我正在使用从 rails generate scaffold Book isbn:string condition:string title:string... 生成的 Book(具有 isbn)的标准表单、模型和控制器

4

2 回答 2

1

我找到了一种方法。这可能不是最好的方法,但它确实有效。我的最终文件是它自己的名为 search 的文件,作为一个活动的 ruby​​ 文件

<% conditions = ['BrandNew', 'LikeNew', 'VeryGood', 'Good', 'Acceptable' ]%>
<% client = HTTPClient.new %>
<% uri = 'https://svcs.ebay.com/services/half/HalfFindingService/v1?OPERATION-NAME=findHalfItems&REST-PAYLOAD'%>

<%count=0%>

<%isbn = params[:isbn] %>
<% conditions.each do |condition| %>

<% query = {
       'X-EBAY-SOA-SERVICE-NAME' => 'HalfFindingService',
       'SERVICE-VERSION' => '1.0.0',
       'GLOBAL-ID' => 'EBAY-US',
       'X-EBAY-SOA-SECURITY-APPNAME' => 'Compassi-3b25-406b-b3d6-d69ca7353053',
       'RESPONSE-DATA-FORMAT' => 'XML',
       'productID' => isbn,
       'productID.@type' => 'ISBN',
       'itemFilter' => 'Condition',
       'itemFilter.name' => 'Condition',
       'itemFilter.value' => condition,
       'paginationInput.entriesPerPage' => '3',
       'sortBy' => 'FixedPrice',
       'sortBy.sortOn' => 'FixedPrice',
       'sortBy.sortOrder' => 'INCREASING'
       } %>

<% results = client.get_content(uri, query) %>
<% count += 1 %>
<% doc = Nokogiri::XML.parse(results) %>

<p>
<% if count <= 1 %>
<b><%= "Book Details" %></b>
<br>
<i><%= "--Title:"+doc.css("title").text %></i>
<br>
<i><%= "--Author: "+doc.css("nameValueList/value").text %></i>
<br>
<br>
<b><%= "Prices by Condition:" %></b>
<br>
<br>
<% end %>

<b><%= "Condition: #{condition}" %></b>
<br>
<%  prices = doc.css("price") %>
<%  prices.each do |price| %>
<%=   "$#{price.text}" %>
<br>
<% end %>

</p>

<% end %>

然后在我列出书籍的索引中,我只有一个用于检查价格的单独链接:

<%=link_to 'Check Prices', controller: "pages", :action => "search", :isbn=> book.isbn%>

无论如何感谢所有的帮助!我没有得到我想要做的事情,但我们现在有一个工作页面。

于 2013-05-31T16:16:20.190 回答
0

我将通过创建一个单独的模型类来封装对 ebay 的调用来做到这一点。像这样的东西:

class Book < ActiveRecord::Base
  # existing model code

  def price_information
    @price_information ||= PriceInformation.new(self)
  end
end

class PriceInformation
  def initialize(book)
    get_price_information(book.isbn)
  end

  def get_price_information(isbn)
    # use your script and set accessors appropriately
  end
end

在您看来,在显示页面上(即创建后),您可以简单地执行 book.price_information 来检索相关信息并在您的视图中使用它。

于 2013-05-30T09:39:31.520 回答