2011-09-28 26 views
0

我已經發布了一個與此相關的問題,但尚不清楚。我已經簡化了代碼,所以我可以在這裏複製它,讓它儘可能簡單。我仍然不知道什麼是最好的方式來調試,這可能是,但這裏有雲:調用RDF :: RDFa :: Reader後路由錯誤

我的「新」的動作(可以是任何真的)的資源(再次,可以是任意):

def new 
    RDF::RDFa::Reader.open("http://www.tripadvisor.com/Hotel_Review-g186525-d280839-Reviews-Gerald_s_Place-Edinburgh_Scotland.html") do |r| 
     r.each_statement do |statement| 
     Rails.logger.debug(statement) 
     end 
    end 
    respond_to do |format| 
     format.html { }# new.html.haml 
     format.json { render json: @base_item } 
     format.js 
    end 
    end 

頁面呈現正常,並且RDF代碼運行成功,但是,當我刷新頁面或嘗試訪問其他任何內容時,我會得到以下內容(subitude'base_item',其中包含我嘗試訪問的任何資源,它們全部失敗並出現此錯誤):

ActionController::RoutingError (private method `redefine_method' called for #<Class:0x000001058527c0>): 
    app/models/base_item.rb:3:in `<class:BaseItem>' 
    app/models/base_item.rb:2:in `<top (required)>' 
    app/controllers/base_items_controller.rb:3:in `<top (required)>' 

我想知道這是否是特定於r df gem(它使用nokogiri)或者它是一個普通路由問題,但還沒有找到一種方法來測試它。

任何幫助表示讚賞。

編輯: 看來它與好像我走了這一點,事情保持工作的r.each_statement線做..

更新: 我一直無法重現這個Rails的外但我已經縮小到與ActiveRecord的問題。我已經在https://github.com/slamorsi/rdfTest

設置了一個示例應用程序有兩種模型,Test和TestChild。如果Test和TestChild相關,錯誤是可重現的 - 現在Test與TestChild有has_many關係。該應用程序的根目錄測試#索引,它具有示例RDF/RDFa代碼。如果你加載頁面然後刷新,你會看到'重新定義的方法被稱爲...'錯誤。如果模型之間沒有關係,或者沒有RDF/RDFa語句,那麼執行每個代碼時,一切正常。我不知道可能會導致這種情況。

+0

app/models/base_item.rb中有什麼? – thomasfedb

+0

它似乎不是特定於任何控制器或模型,我可以將該RDF代碼放在任何位置,並且會爲我嘗試訪問的任何資源拋出錯誤,但我將包含在編輯中。 – imorsi

回答

1

RDF寶石不使用Nokogiri,但RDF :: RDFa寶石。例如,您可以嘗試使用Turtle輸入文件運行此操作,並查看是否得到相同的結果。

Queryable#each_statement確實使用了一個迭代器,但我沒有看到這會如何影響您運行的上下文。您可能會查看是否已在@base_item上定義了任何新方法。這可能是一些RDF類定義了干擾Rails的方法,這會是一個bug。

如果你可以做一個簡短的例子,我可以進一步看。提交問題到http://github.com/gkellogg/rdf/issues(如果它不是RDF :: RDFa特定的),否則rdf-rdfa /問題。

+0

謝謝。如果我使用.each_statement調用,則您正確地查看正在定義的新方法。根據我放置代碼的位置,它們處於課堂級別。如果我將它留在控制器中,那麼BaseItemsController(和ApplicationController等).methods數組在.each_statement之前和之後是不同的。如果從控制器中,我調用模型中的方法,那麼控制器類以及模型類也會獲得新方法。方法保持不變,只要使用.open而不是.each_statement – imorsi

+0

RDF :: Reader工作正常,沒有新的方法被添加和路由繼續工作,所以我認爲它是RDF :: RDFa特定的。例如: RDF :: Reader.open(「http://rdf.rubyforge.org/doap.nt」)do | reader | reader.each_statement do | statement | 提出聲明。檢查 結束 結束 – imorsi

+0

跳過最後一條評論的槍。它也打破了RDF :: Reader。 graph = RDF :: Graph.load(「http://www.tripadvisor.com/Hotel_Review-g186525-d280839-Reviews-Gerald_s_Place-Edinburgh_Scotland.html」)也打破了。 Graph和Reader的.new/.open不會破壞任何內容。 – imorsi