2

次の XML 構造があります。

<agencies>
  <city>
    <name>New York</name>
    <address>Street A, 101</address>
    <phone>111-222-333</phone>
  </city>
  <city>
    <name>Chicago</name>
    <address>Street B, 201</address>
    <phone>111-222-333</phone>
  </city>
</agencies>

そして、それを操作するRubyクラスを作成しようとしています。

クラスファイルを作成しました:

require 'nokogiri'

class Agency

  def initialize(arg)
    @file = arg.gsub(/-/,'_')
    @doc = Nokogiri::XML(open("db/agencies/#{@file}.xml"))
  end

  def find_offices
    @doc.xpath('//agencies/city').map do |i|
      { 'name' => xpath('name') }
    end
    #@entries = @doc.xpath('//agencies/city').map do |i|
    #  { 'name' => xpath('name').inner_text, 'address' => xpath('address').inner_text, 'phone' => xpath('phone').inner_text }
    #end
  end
end

私のコントローラーには次のものがあります。

class AgenciesController < ApplicationController

  def index
    @prefectures = Prefecture.all
  end

  def list
    @prefecture = Agency.new(params[:prefecture_name])
    @offices = @prefecture.find_offices
  end
end

listメソッドは次のエラーを返します。

NoMethodError in AgenciesController#list

undefined method `xpath' for #<Agency:0x9e7f280>
Rails.root: /home/kleber/projects/rails_apps/job_board2

Application Trace | Framework Trace | Full Trace
app/models/agency.rb:13:in `block in find_offices'
app/models/agency.rb:12:in `map'
app/models/agency.rb:12:in `find_offices'
app/controllers/agencies_controller.rb:9:in `list'
4

1 に答える 1

2

このセクションはおかしく見えます:

def find_offices
    @doc.xpath('//agencies/city').map do |i|
      { 'name' => xpath('name') }
    end

iクエリによって返される要素ごとにローカル変数を作成しxpath()ますが、使用しません。を呼び出していますが、呼び出せるクラス (またはグローバル スコープ) でのxpath('name')の定義が見当たりません。xpath()

もっとこういうの書きたかったの?(未テスト) :

      { 'name' => i.xpath('name') }
于 2012-06-19T23:30:20.700 に答える