如何在Ruby中跨类使用用户输入?

如何在Ruby中跨类使用用户输入?,ruby,class,api-design,gets,Ruby,Class,Api Design,Gets,我正在编写一个应用程序,它可以从genius.com上向用户展示前十首歌曲。然后用户可以选择一首歌曲来查看歌词 我想知道如何在scraper类的方法中使用cli类中收集的用户输入 现在,我有一部分刮刀发生在刮刀课之外,但我希望明确划分责任 以下是我的部分代码: Class CLI def get_user_song chosen_song = gets.strip.to_i if chosen_song > 10 || chosen_song < 1 puts &qu

我正在编写一个应用程序,它可以从genius.com上向用户展示前十首歌曲。然后用户可以选择一首歌曲来查看歌词

我想知道如何在scraper类的方法中使用cli类中收集的用户输入

现在,我有一部分刮刀发生在刮刀课之外,但我希望明确划分责任

以下是我的部分代码:

Class CLI

def get_user_song 
  chosen_song = gets.strip.to_i
  if chosen_song > 10 || chosen_song < 1
  puts "Only the hits! Choose a number from 1-10."
end
Class CLI
def get_user_song
所选歌曲=get.strip.to\u i
如果选择歌曲>10 | |选择歌曲<1
放入“仅限点击次数!从1-10中选择一个数字。”
结束
我希望能够做如下的事情

Class Scraper

def self.scrape_lyrics
  page = Nokogiri::HTML(open("https://genius.com/#top-songs")) 
  @url = page.css('div#top-songs a').map {|link| link['href']}
  user_selection = #input_from_cli #<---this is where I'd like to use the output 
  # of the 'gets' method above.

  @print_lyrics = @url[user_selection - 1]
  scrape_2 = Nokogiri::HTML(open(@print_lyrics))
  puts scrape_2.css(".lyrics").text
end 
类刮刀
def self.scrape_歌词
page=Nokogiri::HTML(打开https://genius.com/#top-歌曲)()
@url=page.css('div#top songs a').map{{| link | link['href']}

user_selection=#input_from_cli#我看到了两种可能的解决方案。哪一个适合于此取决于您的设计目标。我将尝试对每个选项进行解释:

  • 通过简单地阅读代码,用户输入数字时不会看到页面内容(通过程序)。在这种情况下,简单的方法是将选定的数字作为参数传递给
    scrape_-lyrpriss
    方法:

    def self.scrape_歌词(用户选择)
    page=Nokogiri::HTML(打开https://genius.com/#top-歌曲)()
    @url=page.css('div#top songs a').map{{| link | link['href']}
    @打印歌词=@url[用户选择-1]
    scrape_2=Nokogiri::HTML(打开(@print_歌词))
    放入scrape_2.css(“歌词”).text
    结束
    
    所有排序都在CLI类中进行,并且在启动时使用所有必要的数据调用scraper

  • 当以更具交互性的方式想象你的工具时,我想让scraper下载当前的前10名并将列表呈现给用户以供选择可能会很有用。在这种情况下,交互作用是有点来回的。 如果仍然需要严格分离,可以将
    scrape_歌词
    分为
    scrape_top_ten
    scrape_歌词_by_number(song_number)
    并在CLI类中对其排序。 如果您期望交互流是非常动态的,那么最好将交互方法注入到scraper中并反转依赖关系:

    def self.scrape_歌词(cli)
    page=Nokogiri::HTML(打开https://genius.com/#top-歌曲)()
    titles=page.css('div#top songs h3:first child').map{t|t.text}
    user_selection=cli.choose(titles)#向用户提供选择,并返回所选号码
    @url=page.css('div#top songs a').map{{| link | link['href']}
    @打印歌词=@url[用户选择-1]
    scrape_2=Nokogiri::HTML(打开(@print_歌词))
    放入scrape_2.css(“歌词”).text
    结束
    
    有关后一种方法的示例实现,请参见


    • 我认为有两种可能的解决方案可以解决您的问题。哪一个适合于此取决于您的设计目标。我将尝试对每个选项进行解释:

      • 通过简单地阅读代码,用户输入数字时不会看到页面内容(通过程序)。在这种情况下,简单的方法是将选定的数字作为参数传递给
        scrape_-lyrpriss
        方法:

        def self.scrape_歌词(用户选择)
        page=Nokogiri::HTML(打开https://genius.com/#top-歌曲)()
        @url=page.css('div#top songs a').map{{| link | link['href']}
        @打印歌词=@url[用户选择-1]
        scrape_2=Nokogiri::HTML(打开(@print_歌词))
        放入scrape_2.css(“歌词”).text
        结束
        
        所有排序都在CLI类中进行,并且在启动时使用所有必要的数据调用scraper

      • 当以更具交互性的方式想象你的工具时,我想让scraper下载当前的前10名并将列表呈现给用户以供选择可能会很有用。在这种情况下,交互作用是有点来回的。 如果仍然需要严格分离,可以将
        scrape_歌词
        分为
        scrape_top_ten
        scrape_歌词_by_number(song_number)
        并在CLI类中对其排序。 如果您期望交互流是非常动态的,那么最好将交互方法注入到scraper中并反转依赖关系:

        def self.scrape_歌词(cli)
        page=Nokogiri::HTML(打开https://genius.com/#top-歌曲)()
        titles=page.css('div#top songs h3:first child').map{t|t.text}
        user_selection=cli.choose(titles)#向用户提供选择,并返回所选号码
        @url=page.css('div#top songs a').map{{| link | link['href']}
        @打印歌词=@url[用户选择-1]
        scrape_2=Nokogiri::HTML(打开(@print_歌词))
        放入scrape_2.css(“歌词”).text
        结束
        
        有关后一种方法的示例实现,请参见


      谢谢你,大卫!我走的是简单的路线。在cli中,我确实有一个方法,首先显示歌曲列表,然后单独搜索歌词。将用户选择作为一个参数输入效果非常好。我不太熟悉依赖注入,但我肯定会学习更多关于它以及tty提示宝石的知识。祝你旅途愉快,@arroyo23!谢谢你,大卫!我走的是简单的路线。在cli中,我确实有一个方法,首先显示歌曲列表,然后单独搜索歌词。将用户选择作为一个参数输入效果非常好。我不太熟悉依赖注入,但我肯定会学习更多关于它以及tty提示宝石的知识。祝你旅途愉快,@arroyo23!