Self-Curation

新卒社会人で営業マンになりました

プログラミング初心者だけどRubyでメタ検索サイトを作ろうとしてる話②

f:id:scuration:20200326233136j:plain
 こんにちは。

 前回は簡単な検索サイトクローリングプログラムを作成しました。

プログラミング初心者だけどRubyでメタ検索サイトを作ろうとしてる話① - コロンブスの卵


 今回はRailsを使ってブラウザ上から実行できるようにリメイクしていきたいと思います。
 ※初心者が初心者のために書いているのでお手柔らかにお願いします。

まずはRailsでアプリを新規作成

1.ターミナルで以下のように入力して最新のRailsをインストール

 $ gem install rails 

2.アプリケーションの新規作成

$ rails new example(任意の名前)

3.コマンドを実行したカレントディレクトリにアプリが生成されているか確認

C:¥…example/app
       /bin
      …

とアプリを構成するファイル・フォルダ群が生成されている

Model・View・Controllerを編集

MVCモデルに則ってコーディングを進めていきます。
MVCモデルとはプログラムをModel・View・Controllerと役割の違いで3つに分けたものです。
それぞれの役割を簡単に説明すると

  • Model:中身
  • View:外側
  • Controller:ModelとViewの制御

といった感じです。

generateコマンドでページ生成

$ rails generate scaffold 任意の名前

今回はsearchという名前で検索機能を作成します。
Model、View、Controllerなどが一通り作成されます。
以下のコマンドも実行しておきます。

$ rake db:migrate
Model

 今回であれば受け取ったキーワードを処理して検索結果として表示されるテキストの生成まで担います。

 このメイン部分については前回説明したプログラムを、Viewから検索キーワードを受け取れるように仕様変更するだけです。ですので#コメントは省きます。
scuration.hateblo.jp

 example\app\models\search.rbに以下を記述して保存。

class Search < ApplicationRecord
        def self.search(search)
            require 'open-uri'
            require 'nokogiri'
            
            # 対象のURL
            url = 'https://~XXX' + search
            
            charset = nil
            html = open(url) do |f|
              charset = f.charset
              f.read 
            end
            
            doc = Nokogiri::HTML.parse(html, nil, charset)
            
            titles = []
            #表示させたい部分のxPathを指定
            doc.xpath('〇〇').each do |node|
                title = node.css('a').inner_text
                titles << title
            end
            titles.each do |text|
            @doc_2 = text
            end
        end
end
View

 今回はトップページに検索ボックスを作成します。
 app/views/index.html.erbを開き検索機能のコードを記述。

<p>検索</p>
<%= form_tag('example/searches', method: :get) do %>
<%= text_field_tag :search %>
<%= submit_tag 'Search', :name => nil %>
<% end %>

 検索ボックスに入力した単語をform_tagメソッドでmodelに渡します。

 またviews/searches/search.rbで以下の記述があるか確認。検索結果はインスタンス変数@exmaple_2に格納され、それを最終的に表示させる役割を持ちます。

<%= @example_2 %>
Controller

app/controllers/searches_controller.rbを開き以下を記述します。

class SearchesController < ApplicationController

  def index
  end
  
  def search
    @example_2 = Search.search(params[:search])
  end

end

 「def index ~ end」「def search ~ end」はそれぞれアクションと呼ばれるものであり、アクションを実行するとviewsフォルダからコントローラーと同名のフォルダを探し、アクション名と同じ名前のviewファイルをブラウザに返します。

 例えばブラウザで「http://~省略~example/(index)」を開くとapp/controllers/searches_controller.rbのindexアクションが実行され、app/views/searches/index.html.erbを表示してくれます。

 またModelで行われた検索処理の結果は@example_2に格納され、検索結果画面にインスタンス変数@example_2を表示します。

ルーティング設定

 最後にルーティングというものを行います。ルーティングとはリクエストURLと実行や処理する先を繋ぐ役割を持ちます。
 example/config/route.rbを開き以下を追記。

Rails.application.routes.draw do
  resources :searches
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
get "example" => "searches#index"
get "example/searches" => "searches#search"
end

 「http://~example」を開くとコントローラーを通じて、最終的に”app/views/searches/index.html.erb”の内容が表示されます。
 またexample/searchesのリクエストを受け取るとsearchesコントローラーのsearchアクションが実行されます。なお最初から入っているURLのコメントはルーティングの参考用に貼られています。

動作確認

ローカル環境でテストするにはターミナルでRailsServerを実行します。

$ rails s

RailsServerが立ち上がった状態でブラウザで

http://localhost:3000/

を開きます。

 その後URL末尾にexampleを追加して開くと検索ボックスが表示されるはずです。検索して意図したものが表示されれば成功です。

 最後まで読んでいただきありがとうございました。