##作ったもの
小説家になろうのアドレスを入力、
ボタンを押すと入力先のタイトル、詳細を取得してきてajaxで表示。
##概要
【jqueryでRailsコントローラの関数を呼んで、変数を画面に送り返す】
というやり方は見かけなかったので貴重かなと思っています。
【概要】
URL入力欄のURLをjqueryで感知
↓
コントローラの独自関数に送る
↓
関数内でスクレイピング、インスタンス変数に情報を入れる
↓
画面上に送り返す
↓
jqueryでid指定などをして情報を画面に表示
##ソースの説明
今回操作する画面は
Matomeモデルのshow画面上となります。
コントローラに関数を定義。スクレイピングは以下を参照してください。
Rails スクレイピング手法 Mechanizeの使い方
def scraping_novel
require 'mechanize'
agent = Mechanize.new
page = agent.get(params[:url])
@novel_title = page.at('.novel_title').inner_text
@novel_description = page.at('#novel_ex').inner_text
respond_to do |format|
format.js
end
end
新しいルートを追加
ルートを追加しないと、なぜかidに関数名が入りうまくいかないです。
Rails.application.routes.draw do
get "matomes/scraping_novel"
resources :novels
resources :matomes
devise_for :users
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
root 'matomes#index'
end
新しいjsファイルを作成。
コントローラ内に作った関数と同じ名前のjs.erbファイルをviews/コントローラ以下に作成してください。
コントローラから取得した2つのインスタンス変数をパース、
分けるために間にdelimiterという単語を入れています。
<%= @novel_title %>delimiter<%= @novel_description %>
このjsは
・コントローラに情報を送る
・コントローラから情報を受け取って表示する
の2つを行なっています。
送るときは、
urlに関数名、
data内にコントローラに送りたい情報を書いてください。
**params[:url]**のような形でコントローラ内で取り出すことができます。
success: function(data)のdataにjs.erbファイルに書いた内容が入ってきます。
タイトルとあらすじの間にdelimiterという単語を挟んでおいたので、
それで分けてjqueryでフォームに入力しています。
URLが想定したものと違う時は
画面上にアラートを出すようになっています。
$("#get-novel-info-button").click(function(){
$.ajax({
url: "scraping_novel",
type: "GET",
data: { url : $("#modal-novel-url").val()
},
dataType: "html",
success: function(data) {
console.log('success');
console.log(data);
// app/views/matomes/scraping_novel.js.erb
//上記ファイルの中身を文字列"delimiter"で分ける
var split_datas = data.split("delimiter");
$("#modal-novel-title").val(split_datas[0]);
$("#modal-novel-description").val(split_datas[1]);
},
error: function(data) {
console.log('error');
alert("URLが不正、もしくはこのURLには対応していません。");
}
});
});
##感想
めっちゃ感動した。
スクレイピングすごい。ajaxすごい。
これ、コントローラを経由するから色々と応用できそうで楽しみすぎる。