2016-03-30 2 views
0

Ich versuche, eine Schnittstelle zum" Laden "einer Tabelle aus einer Arbeitsblattdatei bereitzustellen. Hört sich einfach an, aber ich mache schweres Wetter daraus, ein absoluter Neuling zu sein. Ich habe den action_view helfer asset_path verwendet, um die Datei zu finden, nachdem sie in Assets vorkompiliert wurde, aber es scheint, dass ich die Helfer nicht richtig einbeziehe, weil ich "NoMethodError: undefinierte Methode` asset_path 'für # "bekomme. Hier ist mein Modellcode:Rails: Roo im Modell verwenden, um eine Tabelle zu laden, erhalten: NoMethodError: undefinierte Methode `Asset_Path '

require 'rubygems' 
require 'roo' 
require 'action_view' 

class Item < ActiveRecord::Base 
    include ActionView::Helpers 
    validates :description, presence: true, length: { maximum: 240 } 
    validates :category, presence: true 
    has_many :interests 
    has_many :members, through: :interests 
end 

def populate_items_table 
    from_file = asset_path("item_listing.ods") 
    original_list = Openoffice.new(from_file) 
    original_list.default_sheet = original_list.sheets.first 
    headers = original_list.row(1) 
    ... 
end 

Ich wäre Ihnen sehr dankbar, wenn jemand kann darauf hinweisen, wo ich falsch hier werde. Tue ich das auch im "Rails way"? Sollte diese Art von Code im Modell oder anderswo sein? Ich rate mal woanders, sonst wären die passenden Helfer wohl schon definiert?

Es gibt ähnliche Fragen auf dem Stapel hier, z.B. 1, aber die Antworten scheinen nicht anders zu sein als das, was ich mache.

@shishir: hier ist der Stack-Trace, wenn einschließlich des spezifischen Modul wie vorgeschlagen:

ERROR["test_should_reload_items_table", ItemsControllerTest, 2016-03-22 08:43:53 +0000] test_should_reload_items_table#ItemsControllerTest (1458636233.20s) NoMethodError: NoMethodError: undefined method asset_path' for #<ItemsController:0x000000097cb308> app/models/item.rb:14:in populate_items_table' app/controllers/items_controller.rb:67:in reload' test/controllers/items_controller_test.rb:53:in block in ' app/models/item.rb:14:in populate_items_table' app/controllers/items_controller.rb:67:in reload' test/controllers/items_controller_test.rb:53:in `block in '

Antwort

0

asset_path definiert ist in ActionView :: Helpers :: AssetUrlHelper, die ein Modul ist. verwenden

include ActionView::Helpers::AssetUrlHelper 

statt

include ActionView::Helpers 
+0

Ich habe dies zuvor versucht, und "ActionView :: Template :: Fehler: undefinierte Methode' Fehler 'für Nil: NilClass ". Ich dachte mir, dass ich mit allen Helfern eher alles mit einschloss, von dem das spezifischere Modul abhing? – FBtLL

+0

Kann die Stack-Trace für Fehler für Null-Klasse einfügen? – Shishir

+0

Ich entschuldige mich, ich stürzte mich in diese Antwort. Der ActionView :: Template :: Fehler war nicht verwandt, ich hatte versucht, in anderen Bereichen Fortschritte zu machen, und dieser Fehler bezieht sich auf Sachen, die noch nicht gebaut wurden ... Ich habe jetzt die korrekte Spur aus dem Test des Modellcodes gepostet und meldet immer noch undefined_method. – FBtLL

0
class Item < ActiveRecord::Base 
    include ActionView::Helpers 
    validates :description, presence: true, length: { maximum: 240 } 
    validates :category, presence: true 
    has_many :interests 
    has_many :members, through: :interests 

    def populate_items_table 
     from_file = asset_path("item_listing.ods") 
     original_list = Openoffice.new(from_file) 
     original_list.default_sheet = original_list.sheets.first 
     headers = original_list.row(1) 
     ... 
    end 

end 

Wenn ich richtig verstehe, wird Ihre Funktion nicht, wenn es nicht innerhalb der Klasse ist.

Unabhängig davon müssen Sie ActionView :: Helpers so einbinden, dass sie den Aufruf asset_path erreichen, was sie derzeit nicht tut (da sie in der Klasse getrennt ist, die sich derzeit in einem anderen Bereich befindet als die Funktion) Sie haben das deklariert.)

+0

Jetzt bin ich sehr verwirrt. Was meinst du, meine Funktion wird nicht funktionieren, wenn es nicht in der Klasse ist? Es ist in der Klasse Item, nicht wahr? Und hier habe ich die Helfer eingeschlossen. Wie sollte ich die Helfer einbeziehen? Ich befolge nur Beispiele, die von anderen für ähnliche Fragen eingereicht wurden. – FBtLL