現在リファクタリングを勉強しているのですが、なかなか思う様に動かず学習がストップしています。特に悩んでいるのは、どこの処理をまとめてメソッド化するのかということです。オブジェクト指向やリーダブルコードの本を一式読んで大体のイメージはあるのですが、自分のコードに置き換えるとたちまちエラーで進みません。自分では全くリファクタリングの見当がつかず、少し丸投げの様な質問になっています。以下には自分なりに試したことやわからないことを記載しますので、ぜひご教授いただければと思います。
リファクタリング対象のコード
ruby
1#app/models/clone.rb 2class Clone < ApplicationRecord 3 4 require 'nokogiri' 5 require 'httparty' 6 require 'byebug' 7 8 url = 'https://terateil' 9 unparsed_page = HTTParty.get(url) 10 parsed_page = Nokogiri::HTML(unparsed_page) 11 12 vol_listing = parsed_page.css('div.card-eventSingle') 13 page = 1 14 card_body_count = vol_listing.count 15 total_before = parsed_page.css('strong')[1].text 16 total = total_before.to_i 17 last_page = (total.to_f / card_body_count.to_f).round 18 while page <= last_page 19 pagination_url = "https://terateil#{page}" 20 pagination_unparsed_page = HTTParty.get(pagination_url) 21 pagination_parsed_page = Nokogiri::HTML(pagination_unparsed_page) 22 pagination_vol_listing = pagination_parsed_page.css('div.card-eventSingle') 23 pagination_vol_listing.each do |vol| 24 volunteer = { 25 title: vol.css('a.two-four-lines').text , 26 group: vol.css('a.d-inline-block').text, 27 content: vol.css('p.two-lines').text, 28 url: 'https://terateil' + vol.css('a.two-four-lines')[0].attributes["href"].value 29 } 30 url = volunteer[:url] 31 unparsed_page = HTTParty.get(url) 32 parsed_page = Nokogiri::HTML(unparsed_page) 33 db_table = Clone.find_by(url: url) 34 35 if db_table.nil? 36 title = volunteer[:title] 37 group = volunteer[:group] 38 content = volunteer[:content] 39 scrape = Clone.new(title: title, group: group, content: content, url: url) 40 scrape.save 41 end 42 end 43 page += 1 44 end 45
試したこと
ruby
1class Clone < ApplicationRecord 2 3 def self.set_url_for_scraping(set_url) 4 url = 'seturl' 5 unparsed_page = HTTParty.get(url) 6 parsed_page = Nokogiri::HTML(unparsed_page) 7 end 8 9 require 'nokogiri' 10 require 'httparty' 11 require 'byebug' 12 13 vol_listing = parsed_page.css('div.card-eventSingle') 14 page = 1 15 card_body_count = vol_listing.count 16 total_before = parsed_page.css('strong')[1].text 17 total = total_before.to_i 18 last_page = (total.to_f / card_body_count.to_f).round 19 while page <= last_page 20 Clone.set_url_for_scraping(https://terateil#{page}) #クラスメソッド呼び出し 21 pagination_vol_listing = pagination_parsed_page.css('div.card-eventSingle') 22 pagination_vol_listing.each do |vol| 23 volunteer = { 24 title: vol.css('a.two-four-lines').text , 25 group: vol.css('a.d-inline-block').text, 26 content: vol.css('p.two-lines').text, 27 url: 'https://terateil' + vol.css('a.two-four-lines')[0].attributes["href"].value 28 } 29 self.set_url_for_scraping(volunteer[:url]) #クラスメソッド呼び出し 30 db_table = Clone.find_by(url: url) 31 32 if db_table.nil? 33 title = volunteer[:title] 34 group = volunteer[:group] 35 content = volunteer[:content] 36 scrape = Clone.new(title: title, group: group, content: content, url: url) 37 scrape.save 38 end 39 end 40 page += 1 41 end 42end
こんな感じで「set_url_for_scraping(set_url)」を作ったりしましたが、一つ作った時点でエラーが出ました。
補足(わからないこと)
Rails: 5.2.3
OS: Mac
一度答えを見ればイメージがつかめるはずなのですが、自分で書いたコードのため正解がわかりません。答えを聞く様な形になってしまいますが、このままでは全く先に進めませんので、一度正解例を見せていただき、学習を再開させていただければ幸いです。
回答2件
あなたの回答
tips
プレビュー