2012-11-21 3 views
0

나는이 루비 https://github.com/mattetti/Pvwatts 래퍼 사용하기 위해 노력하고있어하지만 난 내 컨트롤러 응용 프로그램/컨트롤러/projects_controller.rb에 문제가있다 (관련 발췌)나가서 설명하자면 NameError (초기화되지 않은 상수 Savon :: 요청)

require 'rubygems' 
require 'savon' 

class ProjectsController < ApplicationController 
    <snip> 
    def annual_production 
     <snip> 
     client = Savon::Client.new("http://pvwatts.nrel.gov/PVWATTS.asmx?WSDL") 
     production_data = Pvwatts.new("<key>").yearly_production(:locationId => @locationId, :dc_rating => @dc_rating, :tilt => @tilt, :azimuth => @azimuth, :derate => @derate, :cost => @cost, :array_type => @array_type) 
     <snip> 
     respond_to do |format| 
      if @project.update_attributes(params[:project]) 
       format.js 
       format.html 
      else 
       format.html { render :action => "update" } 
       format.json { render :json => @project.errors, :status => :unprocessable_entity } 
      end 
     end 
    end 
end 

class Pvwatts 
    Savon::Request.log = false 
    <snip> 
    def yearly_production(opts={}) 
     <snip> 
     client = Savon::Client.new("http://pvwatts.nrel.gov/PVWATTS.asmx?WSDL") 
     <snip> 
     req = prep_request(@locationId, @dc_rating, @tilt, @azimuth, @derate, @array_type, @cost) 
     response = client.get_pvwatts{|soap| soap.input = "GetPVWATTS"; soap.body = req } 
     <snip> 
    end 
end 

이가 그 버튼을 클릭 SOAP 요청

<input type=button id='pvwatt_update_button_id' value="Update from PVWatts" class='pvwatt_update_button_class'> 

를 트리거 버튼의 정의는,이 "500 내부 서버 오류"

Started GET "/projects/annual_production?id=4&keys=8<key>&reference_state=California&reference_city=San+Francisco&locationId=23234&dc_rating=1&tilt=20&azimuth=180&derate=80&cost=0.1&array_type=0" for <server_ip_address> at Tue Nov 20 20:07:18 -0800 2012 
Processing by ProjectsController#annual_production as */* 
Parameters: {"array_type"=>"0", "azimuth"=>"180", "locationId"=>"23234", "dc_rating"=>"1", "reference_city"=>"San Francisco", "keys"=>"<key>", "id"=>"4", "derate"=>"80", "reference_state"=>"California", "cost"=>"0.1", "tilt"=>"20"} 
Project Load (0.2ms) SELECT "projects".* FROM "projects" WHERE "projects"."id" = ? LIMIT 1 [["id", "4"]] 
Completed 500 Internal Server Error in 282ms 

NameError (uninitialized constant Savon::Request): 
app/controllers/projects_controller.rb:1697 
app/controllers/projects_controller.rb:1628:in `annual_production' 

Rendered /var/lib/gems/1.8/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.6ms) 
Rendered /var/lib/gems/1.8/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.2ms) 
Rendered /var/lib/gems/1.8/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (10.0ms) 
를 얻을 수

누구든지 내가 뭘 잘못하고 있는지 알 수 있습니까? 여기

내 설치 보석 내 루비를

[email protected]:/home/user/myapp# gem list 

*** LOCAL GEMS *** 

actionmailer (3.2.9) 
actionpack (3.2.9) 
activemodel (3.2.9) 
activerecord (3.2.9) 
activeresource (3.2.9) 
activesupport (3.2.9) 
akami (1.2.0) 
arel (3.0.2) 
builder (3.0.4) 
bundler (1.2.2, 1.2.1) 
coffee-rails (3.2.2) 
coffee-script (2.2.0) 
coffee-script-source (1.4.0) 
erubis (2.7.0) 
execjs (1.4.0) 
git (1.2.5) 
gyoku (0.4.6) 
hike (1.2.1) 
httpi (1.1.1) 
i18n (0.6.1) 
jeweler (1.8.4) 
journey (1.0.4) 
jquery-rails (2.1.3) 
json (1.7.5) 
libv8 (3.3.10.4 x86-linux) 
mail (2.4.4) 
mime-types (1.19) 
multi_json (1.3.7) 
nokogiri (1.5.5) 
nori (1.1.3) 
polyglot (0.3.3) 
rack (1.4.1) 
rack-cache (1.2) 
rack-ssl (1.3.2) 
rack-test (0.6.2) 
rails (3.2.9) 
railties (3.2.9) 
rake (10.0.2, 10.0.1) 
rdoc (3.12) 
sass (3.2.3) 
sass-rails (3.2.5) 
savon (1.2.0) 
sprockets (2.2.1) 
sqlite3 (1.3.6) 
therubyracer (0.10.2) 
thor (0.16.0) 
tilt (1.3.3) 
treetop (1.4.12) 
tzinfo (0.3.35) 
uglifier (1.3.0) 
wasabi (2.5.1) 

을 나열하고 여기이며, 레일 버전

[email protected]:/home/user/myapp# gem -v 
1.8.15 
[email protected]:/home/user/myapp# ruby -v 
ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-linux] 
[email protected]:/home/user/myapp# rails -v 
Rails 3.2.9 
[email protected]:/home/user/myapp# 

업데이트 1

NoMethodError (undefined method `debug' for :logger:Symbol): 
app/controllers/projects_controller.rb:1757:in `yearly_production' 
app/controllers/projects_controller.rb:1638:in `annual_production' 

업데이트 2

NoMethodError (undefined method `get_pvwatts' for #<Savon::Client:0xb275c15c>): 
app/controllers/projects_controller.rb:1737:in `yearly_production' 
app/controllers/projects_controller.rb:1628:in `annual_production' 

업데이트 3

나를 위해 일한 코드는 다음과 같다 :

Savon.configure do |c| 
    c.log = false 
    c.logger = Rails.logger 
end 

client = Savon::Client.new do 
    wsdl.document = "http://pvwatts.nrel.gov/PVWATTS.asmx?WSDL" 
end 

response = client.request :wsdl, "get_pvwatts" do 
    soap.body = req 
end 

rdata = response.to_hash 

답변

2

Savon의 구문이 1.x 버전을 통과 한 이후로 변경되었습니다. 최신 버전이 설치되어 있습니다.

저는 웹 서비스를 SoapUI라는 도구를 사용하여 조사했습니다. 나는 SOAP 클라이언트를 개발하는 동안 그것을 강력하게 추천한다. 도구에서 호출을 생성 할 수 있으며 실제 소스 코드를 작성하기 전에 SOAP 수준에서 문제를 해결할 수 있습니다. 이주는 (기존의?) 웹 서비스는 명시 적으로 SOAPAction을 설정해야합니다.

저는 이것을 모두 루비 스크립트에 넣었습니다. 나는 WSDL을 사용하지 않았다. Savon의 WSDL 지원이 완전하지 않습니다. 저자는 개선 된 버전으로 작업하고 있습니다. 네임 스페이스와 끝점을 하드 코드했습니다.

#!ruby 

require 'savon' 
require 'pp' 

Savon.configure do |c| 
    c.log = true 
    c.pretty_print_xml = true 
end 

client = Savon::Client.new do 
    # wsdl.document = "http://pvwatts.nrel.gov/PVWATTS.asmx?WSDL" 
    wsdl.endpoint = "http://pvwatts.nrel.gov/PVWATTS.asmx" 
    wsdl.namespace = "http://pvwatts.nrel.gov" 
end 

begin 
    response = client.request :pvw, "GetPVWATTS" do 
    http.headers['SOAPAction'] = '"http://pvwatts.nrel.gov/GetPVWATTS"' 
    soap.body = { 'pvw:key' => 'your_secret', 
        'pvw:latitude' => 43, 
        'pvw:longitude' => 280 } 
    end 
    pp response.to_hash 
rescue Savon::SOAP::Fault => error 
    print error 
end 

인증 코드가 없어 내 컴퓨터에서 유효한 결과를 반환하지 않습니다. 그게 당신이 다음 단계를 만드는 데 도움이되었는지 알려주십시오.

+0

답장을 보내 주셔서 감사합니다 Steffen. 제안한 변경 사항을 구현했으며 위의 업데이트 1에서 오류가보고되었습니다. 어떤 생각이 아직도 잘못 됐나요? 감사합니다. – rh4games

+0

로거 라인을 작성하기에는 너무 빠르다고 생각합니다. 로거 메소드를 구현하지 않았다면, 라인을 주석 처리하거나'Rails.로거 '를 실행합니다. 레일즈 애플리케이션에 통합하기 전에 일반적으로 작은 코드 스 니펫을 실행하려고합니다. –

+0

후속 조치에 대해 Steffen에게 감사드립니다. 내 질문을 다시 편집하고 Update 3에 나와있는 코드를 추가했습니다. 도와 주셔서 정말로 고맙습니다. – rh4games

0

그 라이브러리가 아주 오래, 그리고 Savon는 지난 2 년 동안 변경된 것 같습니다. 문제의 클래스는 이제 Savon::SOAP::Request이라고 표시되고 더 이상 log= 메서드가 없습니다. 코드를 볼 때부터 으로, Savon::Request에 대한 모든 참조를 삭제하면됩니다.

+0

답변 해 주셔서 감사합니다. Savon :: Request에 대한 모든 참조를 제거했으며 위의 업데이트 2에서 오류가보고되었습니다. 어떤 생각이 아직도 잘못 됐나요? 감사합니다 – rh4games

관련 문제