2016-08-29 1 views
1

Ich habe diesen Code und es funktioniert perfektVerpackungscode, der in ein Modul in Rails-Umgebung läuft

require "date" 
     @past = [] 
     @future = [] 

    @artist = Artist.find(2) 

    def sort_by_date(artist) 
     artist.events.each do |event| 
      if event.date < DateTime.now 
       @past << event.id 
      else 
       @future << event.id 
      end 
     end 
    end 

    def event_title(arr) 
     arr.each do |event_id| 
      e = Event.find(event_id) 
      artist_names = [] 

      e.artists.each do |artist| 
       unless artist.name == @artist.name 
        artist_names << artist.name 
       end 
      end 

      puts "#{e.name} with #{artist_names.join(", ")} at #{(Venue.find(e.venue_id)).name}" 
     end 
    end 

    sort_by_date(@artist) 
    puts "Upcoming Events: " 
    event_title(@future) 
    puts "Past Events: " 
    event_title(@past) 

ich diese Operation in einem Modul ausgeführt werden soll wickeln, aber ich habe Probleme zu verstehen, wie artist_id passieren dazu richtig. Mit diesem Befehl rails runner app/modules/artist_event_sort.rb erhalte ich diesen Fehler: `` ': undefined Methode sort_by_date' for SortedArtistEvents:Module (NoMethodError). Die beiden Methoden sort_by_date und event_title funktionierten so, wie sie es sollten, bevor ich versuchte, diese ganze Operation in ein Modul zu verpacken, so dass ich weiß, dass ich etwas verpasst habe.

module SortedArtistEvents 
    require "date" 
    attr_accessor :artist_id 
    def initialize(artist_id) 
     @past = [] 
     @future = [] 
     @artist = Artist.find(artist_id) 
    end 


    def sort_by_date(artist) 
     artist.events.each do |event| 
      if event.date < DateTime.now 
       @past << event.id 
      else 
       @future << event.id 
      end 
     end 
    end 

    def event_title(arr) 
     arr.each do |event_id| 
      e = Event.find(event_id) 
      artist_names = [] 

      e.artists.each do |artist| 
       unless artist.name == @artist.name 
        artist_names << artist.name 
       end 
      end 

      puts "#{e.name} with #{artist_names.join(", ")} at #{(Venue.find(e.venue_id)).name}" 

     end 
    end 

    sort_by_date(@artist) 
    puts "Upcoming Events: " 
    self.event_title(@future) 
    puts "Past Events: " 
    event_title(@past) 
end 

class LetsSort 
    include SortedArtistEvents 
end 
test_artist_sort = LetsSort.new(2) 
+0

Sie zB: ArtistEventSort aber das Modul genannt wird: SortedArtistEvents. – BKSpurgeon

+0

oh man, ok das habe ich behoben. immer noch der gleiche Fehler. – sivanes

+0

Wie initialisierst du dein Modul aus der LetsSort-Klasse? – BKSpurgeon

Antwort

0

Es sieht so aus, als ob hier ein paar Dinge falsch sind. Sie versuchen, ein Modul zu initialisieren, Sie können nur eine Klasse initialisieren, z. class SortedArtistEvents.

Wenn Sie dies:

module Foo 
    def bar; end 
end 

bar nur zugänglich ist, indem oder ein Modul oder eine Klasse mit Foo erstreckt. Mit Ihrem Fehler undefined method sort_by_date' for SortedArtistEvents:Module würden Sie

module SortedArtistsEvents 
    def self.sort_by_date; end 
end 

Verhalten zu bekommen zu tun haben, wie SortedArtistsEvents.sort_by_date

+0

Ich habe eine Klasse erstellt, die mein Modul initialisiert hat, es ist gegen Ende meines Codes. Wenn alle ein Modul enthalten, müssen alle seine Methoden "selbst" haben, um sie zu benutzen? – sivanes

+0

nein sie nicht, wäre es wahrscheinlich schneller zu google, siehe hier http://www.tutorialspoint.com/ruby/ruby_modules.htm – nikkypx

+0

ok so, Hinzufügen von Stichwort 'sort' zu dieser Methode, bekomme ich die' undefined Methode "Ereignisse", die darin ist. das ist ein anderes, das hier falsch ist - "@ artist" Variable wird nicht richtig deklariert. – sivanes