Closed pekorinko closed 3 years ago
results_controller.rb
の以下コードをbegin~rescue
で囲ったbegin
place_data_scraper = MyTools::PlaceDataScraper.new(@url)
place = place_data_scraper.save_place
place_id = place.id
place_data_scraper.save_review(place_id)
@place = place_data_scraper.save_place
user_id = session[:user_id]
check_credibility = MyTools::CheckCredibility.new(place_id)
@result = check_credibility.credibility(user_id)
redirect_to result_path(@result)
rescue StandardError
redirect_to root_path, notice: '口コミの取得に失敗しました'
end
lib/my_tools/selenium_tool.rb:10:in
initialize'を
begin~rescue`で囲ったplace_data_scraper.rb
のsave_place
メソッドでエラーが起こるなど、特定のメソッドやクラスでエラーを免れても、URLを使うクラスやメソッドがある限りエラーが起こり続けると思った上記の気付きから、「各URLを使用するクラスを呼び出しているresults_controller.rb
のcreateメソッドの上記部分をbegin~rescue
で囲えば良いのでは?」という発想に至った
begin~rescue
の処理を書くのはrailsの作法的に正しいのか?【results_controller.rb】
def create
@url = params[:url]
url_filter = MyTools::UrlFilter.new(@url)
@url = url_filter.filter
url_validator = MyTools::UrlValidator.new(@url)
if url_validator.validate
begin ←【railsの作法的にbegin~rescue処理をコントローラーに書くのは大丈夫なのか?】
place_data_scraper = MyTools::PlaceDataScraper.new(@url)
place = place_data_scraper.save_place
place_id = place.id
place_data_scraper.save_review(place_id)
@place = place_data_scraper.save_place
user_id = session[:user_id]
check_credibility = MyTools::CheckCredibility.new(place_id)
@result = check_credibility.credibility(user_id)
redirect_to result_path(@result)
rescue StandardError
redirect_to root_path, alert: '口コミの取得に失敗しました'
end
else
redirect_to root_path, alert: '不正なURLです'
end
end
Gooleの口コミが無いURLを検索した後に改めてGoogleの口コミURLを入力して調査ボタンを押すと「口コミの取得に失敗しました」とアラートが出てしまう 「口コミの取得に失敗しました」とアラートが出た後に再度、口コミURLを入力して「調査」ボタンを押すと正常に挙動し、口コミの調査結果を表示してくれる
46: place = place_data_scraper.save_place
全部作り終わった後に再考する
→HTMLの構造改善(application.html.erbにCSSをまとめる、_form.html.erbの廃止)をしたら自然にバグが解消された
例)口コミがそもそも存在しないGoogleの検索結果のURL
現状
https://www.google.com/~
が入力された場合以下エラーが起こるlib/my_tools/selenium_tool.rb:10:in
initialize' lib/my_tools/place_data_scraper.rb:7:in
new' lib/my_tools/place_data_scraper.rb:7:ininitialize' app/controllers/results_controller.rb:43:in
new' app/controllers/results_controller.rb:43:in `create'【selenium_tool.rb】 def initialize(url) @url = url options = Selenium::WebDriver::Chrome::Options.new options.add_argument('--headless') @d = Selenium::WebDriver.for :chrome, options: options wait = Selenium::WebDriver::Wait.new(timeout: 30) @d.get(@url) wait.until { @d.find_element(:class_name, 'lcorif').displayed? }←口コミモーダルが表示されるまで30秒待つ end