【Rails】楽天APIを使った商品検索をAjax(ページ遷移なし)で実装する( Amazon APIでも応用可 )
【Rails】楽天APIを使った商品検索をAjax(ページ遷移なし)で実装する( Amazon APIでも応用可 ):
今日はRailsのお話です。
楽天APIを使って Ajax(非同期通信)でページ遷移することなく商品の検索結果を表示する という機能を実装してみようと思います。
AmazonAPIを使いたいという方でもデータの引っ張り方が違うだけなのでほぼ変わりません。
ページ遷移することなく楽天市場の検索結果が表示されていますね!
(デザインは好きなように変更してください^^;)
2番目の「ハローキティ お金遊びセット」が気になるところですが話を進めます。
この機能を実装するためにはいくつか方法が考えられます。
例えば、jQueryでajax処理をそのまま書いて楽天APIからデータを引っ張ってくることができそうです。
機能としてはこれでも動きます。しかし,jQueryで
まずいですね^^;
そこで今回はRailsに用意されている
(Railsに感謝^^)
楽天会員に登録、ログインしてからアプリ新規作成フォームからアプリIDを発行してください。
新規アプリ作成ボタンを押すと
この
次に使用するgemを追加します。Gemfileに以下の記述を追加して
config/initializersのディレクトリに名前は何でもいいので .rb ファイルを作りましょう。
今回は
次に代入する環境変数を設定します。
Gemfileと同じ階層に
ここでは仮に
あとバージョンをgitで管理する人は
これでアプリIDを隠すことができました。(Railsに感謝^^)
ここまでで楽天APIを使う準備が整いました.
今回はできるだけシンプルに記述してみます。動くはずですがテストはしてないので、動かねえよ!と気づいた方は教えてください^^; ここではデータの保存はしないのでModelは作ってません。
Toppagesコントローラーのindexアクションから呼ばれる
(Toppagesコントローラーは予め作っておいたものです。
form_tag を使って商品検索のための検索フォームを作っています。
このフォーム
ここで重要なのが
つまりAjax処理が簡単に行えるわけです。
通常であればフォームの
それが
続いてコントローラーです。
ほとんどの説明はコメントアウトでしてみました^^
はじめのViewではフォームから
では呼び出される
ここでしたい処理は検索フォームの設置されていた呼び出し元のView
これで無事に
Ajax処理の完了です!
お疲れさまでした^^
今回は楽天APIを使ってページ遷移なしで商品の検索結果を表示することができました。
これは初めにも言ったようにAmazon APIにも応用できそうですね。
最近、寒いですね。文系大学生の僕はただいま就活中です。これからもたまにQiitaに記事を投稿するのでよろしくお願いします^^
ありがとうございました。
今日はRailsのお話です。
楽天APIを使って Ajax(非同期通信)でページ遷移することなく商品の検索結果を表示する という機能を実装してみようと思います。
AmazonAPIを使いたいという方でもデータの引っ張り方が違うだけなのでほぼ変わりません。
理想とする動きはこちらです。
ページ遷移することなく楽天市場の検索結果が表示されていますね!
(デザインは好きなように変更してください^^;)
2番目の「ハローキティ お金遊びセット」が気になるところですが話を進めます。
この機能を実装するためにはいくつか方法が考えられます。
例えば、jQueryでajax処理をそのまま書いて楽天APIからデータを引っ張ってくることができそうです。
$.ajax({ type: 'get', url: 'https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706?', data: { applicationId: "ここにアプリケーションIDを書く", keyword: keyword, }
applicationId
をそのまま書いてしまうと開発者ツールを使って誰でもapplicationId
を確認することができます。まずいですね^^;
そこで今回はRailsに用意されている
remote: true
という機能を使ってAjax処理を簡単に行いましょう.(Railsに感謝^^)
楽天APIの導入まで (飛ばしてok)
楽天会員に登録、ログインしてからアプリ新規作成フォームからアプリIDを発行してください。新規アプリ作成ボタンを押すと
- アプリケーションID
- アフィリエイトID
この
アプリケーションID
は悪用されるとまずいので誰にも見せないようにしましょう。さっきのjQueryを使ったAjax処理ではここが丸見えだったということです。次に使用するgemを追加します。Gemfileに以下の記述を追加して
bundle install
しましょう。Gemfile
gem 'rakuten_web_service' gem 'dotenv-rails'
rakuten_web_service
は楽天APIを扱うためのGem、dotenv-rails
は環境変数を簡単に扱うためのGemです(単純にアプリケーションIDを隠すために必要だと思っておいても大丈夫です)。config/initializersのディレクトリに名前は何でもいいので .rb ファイルを作りましょう。
config/initializers/rakuten_api.rb
RakutenWebService.configure do |c| c.application_id = ENV['Rakuten_API_KEY'] end
rakuten_api.rb
というファイルを作りました。次に代入する環境変数を設定します。
Gemfileと同じ階層に
.env
というファイルを作ってください。.env
Rakuten_API_KEY=0123456789123456789 #自分のアプリIDを入れてください。
0123456789123456789
としています。.env
で環境変数を設定してinitializers
以下の作成したファイルでENV['Rakuten_API_KEY']
として代入することができました。環境変数はENV['環境変数']
と書いて取り出すことができます。気になる人はコンソールでENV['Rakuten_API_KEY']
と書いてみましょう。あとバージョンをgitで管理する人は
.env
をgitignoreするのを忘れないようにしましょう。.gitignore
.env #追加しておく
ここまでで楽天APIを使う準備が整いました.
Ajax処理を書いていこう
今回はできるだけシンプルに記述してみます。動くはずですがテストはしてないので、動かねえよ!と気づいた方は教えてください^^; ここではデータの保存はしないのでModelは作ってません。
まずはルーティング
route.rb
Rails.application.routes.draw do root to: 'toppages#index' get 'toppages_search' => 'toppagse#search' end
index.html.erb
がrootとして表示されるようにしました。そしてtoppages_search
に get が送られるとToppagesコントローラーのsearchアクションが呼ばれるようにルーティングを設定しました。(Toppagesコントローラーは予め作っておいたものです。
rails g controller
コマンドで作れます^^;)
Viewをみていこう
index.html.erb
<%= form_tag :toppages_search, method: :get, remote: true do -%> <%= label_tag :keyword, 'キーワード検索'%> <%= text_field_tag 'keyword', params[:keyword] %> <%= submit_tag('Ajaxで検索結果を表示') %> <% end %> # ▽▽▽ここに返ってくる商品情報を入れるよ▽▽▽ <div id="Remote"></div>
このフォーム
<%= form_tag :toppages_search, method: :get, remote: true do -%>
では<%= submit_tag %>
が押された時にtoppagesコントローラーのsearchアクションに get を送ることを設定しています。メソッドをgetに指定しないとpostになるので注意です。ここで重要なのが
remote: true
を書いてあげることです。remote: true
を書くことで次に呼び出すリクエストがhtmlファイルからjsファイルに変わります。(説明が難しい^^;;)つまりAjax処理が簡単に行えるわけです。
通常であればフォームの
submit
ボタンが押されればそれに対応したコントローラーのアクションからhtml.erbなどのviewファイルがrender(呼び出し)され ページ遷移して 表示されます。それが
remote: true
を書くだけでhtml.erbではなくjs.erbなどのjsファイルが呼び出しされるようになります。jsファイルであればDOM操作して ページ遷移することなく viewの表示を変えれそうです。
コントローラーでの処理
続いてコントローラーです。toppages_controller.rb
class ToppagesController < ApplicationController def index end def search @keyword = params[:keyword] #送られてきたキーワードが空ではないか確認してして、大丈夫ならajax_hatsudoメソッドを呼び出します。 ajax_hatsudo if @keyword.present? end #呼び出されるajax_hatsudoメソッドです。 def ajax_hatsudo #楽天APIから検索キーワードでヒットした商品を変数@itemsに入れてViewに渡してあげます。 @items = RakutenWebService::Ichiba::Item.search(keyword: params[:keyword]) end end
はじめのViewではフォームから
serachアクション
に remote:true
で getのリクエスト
を送っていました。remote:true
があるので 通常は search.html.erb
が呼び出されるところが search.js.erb
と変わります。では呼び出される
search.js.erb
をみていきましょう。
呼び出されるjsファイル
ここでしたい処理は検索フォームの設置されていた呼び出し元のView index.html.erb
のDOM操作(JavaScriotでHTMLの要素を追加する)です。search.js.erb
# ▽▽▽index.html.erbに用意しておいた<div id="Remote"></div>の中身を空にする(2回目以降の検索で前のデータを消したいため。)▽▽▽ $('#Remote').empty(); # コントローラーから渡された変数@itemsを処理する。js.erbなのでRubyのコードを使うことができる。ここでは@itemsに入っている初めの3つを取り出して処理する。 <% @items.first(3).each do |item| %> # idがRemoteのHTML要素の中に、新たな要素を追加 $('#Remote').append("<p><%= "#{item['itemName']}, #{item.price} yen" %></p>") <% end %>
item['itemName']
などは楽天APIでの決められたデータの取り出し方です。これで無事に
index.html.erb
のHTML要素を変更できました。Ajax処理の完了です!
まとめ
お疲れさまでした^^今回は楽天APIを使ってページ遷移なしで商品の検索結果を表示することができました。
これは初めにも言ったようにAmazon APIにも応用できそうですね。
remote: true
を使った処理は長すぎるフォームを分割して表示する時やページをまとめてスッキリさせたい時など様々応用できそうです。
どうでもいい世間話
最近、寒いですね。文系大学生の僕はただいま就活中です。これからもたまにQiitaに記事を投稿するのでよろしくお願いします^^ありがとうございました。
コメント
コメントを投稿