ゲームエフェクトデザイナーのブログ (新)

レポート記事とかUE4のマテリアルとか。C#とかも触ったり。

フォームからURLを受け取ってスクレイピングした値をテーブルに追加する

Ruby on RailsでURLを登録してリンク集を作成できるウェブアプリを制作中なのですが、データの新規登録ページ(new.html)の form_for ヘルパーでフォームから入力されたURLを受け取って、そのURL先のサイトのページタイトルをデータベースのテーブルに登録して index.html にリダイレクト時にページタイトルを一覧することができたので、メモしておきます。

こんな感じです。

f:id:moko_03_25:20190528010007g:plain

素人丸出しの滅茶苦茶強引な方法ですが、とりあえず実現だけはうまくいきました。

まず「new.html.erb」は下記のような感じです。
form_for でフォームに入力した値を受け取ります。こちらは普通の記述かと思います。

<h2>Add New URL</h2>
<%= form_for :website, url: websites_path do |f| %>
  <p>
    <%= f.text_field :address, placeholder: 'URLを入力してください' %>
    <% if @website.errors.messages[:address].any? %>
      <span class="error">
        <%= @website.errors.messages[:address][0] %>
      </span>
    <% end %>
  </p>
  <p>
    <%= f.text_field :detail, placeholder: 'サイトの説明を入力してください' %>
  </p>
  <p>
    <%= f.submit "登録する" %>
  </p>
<% end %>


コントローラはこんな感じです。
こちらはひどいです。nokogiriでスクレイピングしてタイトルを取得するコードをコントローラのアクション内にまるまる記述しています。
ちゃんとスクレイピング用にrbファイルを作って呼び出すべきなんでしょうね。。

def create
  @website = Website.new(params.require(:website).permit(:address, :detail))
  if @website.save

    require 'nokogiri'
    require 'open-uri'

    charset = nil

    html = open(@website.address) do |f|
      charset = f.charset
      f.read
    end

    doc = Nokogiri::HTML.parse(html, nil, charset)
    @website.title = doc.title
    @website.save

  redirect_to websites_path
  else
    render 'new'
  end
end


参考にさせて頂いたのはこちらの記事です。

とりあえずメモでした!