備忘録。グローバル変数とか使っているのもしかしたらよくないかもしれないですね。あと、そもそもコントローラにこう言った内容は書くべきなのでしょうか。
目的
自分がPHPで作った、第66回理工展の特集ページ一覧をRailsで再現するために調べました。
実践
JSON
適当にpublicフォルダの下に置きました。
/public/json/sample.json
というJSONファイルを扱うと仮定します。中身はこんな感じ。
(先述の特集ページ一覧に類似したJSONを作りました。)
[
{
"name": "脱出ゲーム バイオプロット",
"text": [
"――世界を、壊せ。",
"チームで協力して謎解きをして、陰謀を暴け。"
],
"url": "/feature/hexatrick"
},
{
"name": "ダンスマスターズ",
"text": [
"私たちは年に1度の学園祭だけでなく、全国で踊りを披露するサークルです!"
],
"url": "/feature/dancemaster"
},
{
"name": "パズル謎解き パズルエンジニア",
"text": [
"パズルの国で、秘宝のパズルが失われてしまった!",
"謎を解きながら、そのピースを探そう!"
],
"url": "/feature/puzzlemaster"
}
このJSONファイルを読み込み、配列として扱えるようにするのがこの記事での目標です。
アプリ構築
すでにvisitorというアプリを作っていたので流用しました。とりあえずこれで再現できると思われるコマンドを記載します。(既存のアプリを使ったため動作確認はしていません。ただ大丈夫なはず。)
rails new sample_app
rails g controller visitor json
これにより、sample_appというアプリを作り、その中でvisitorというコントローラを作りました。visitor内にはjsonというビューも最初から作っています。
ビュー・JSON読み込み
では、本題のビューを作っていきましょう。
<% require "json" %>
<% File.open("#{Rails.public_path}/json/sample.json") do |j| %>
<% # File.open("#{Rails.root}/public/json/sample.json") do |j| %>
<% # JSON.load(j) %>
<% $json_str = JSON.load(j)%>
<% end %>
<%= $json_str[1]["name"] %>
1行目で、RubyのJSONを扱うためのモジュールを呼び出します。
2行目で、JSONを呼び出します。#{Rails.public_path}
というのはRailsのpublicフォルダのパスです。なお、public内のファイルは、HTMLタグなどで参照するときは、/json/sample.json
で呼び出せるはずなのですが、Ruby言語内で呼び出すときは、絶対パスでは見つけてくれないようです。
3行目は、2行目の代わりにRailsのルートディレクトリから追った場合です。個人的にメモしたかった。
4行目のコメントアウトを外して、5, 7行目をコメントアウトすると、JSONを読み込んだ結果がそのまま出力されます。ハッシュです。
5行目でJSONをハッシュの形で読み込んで、json_strというグローバル変数に格納しています。
7行目では、5行目で格納したグローバル変数(配列)からデータを呼び出しています。今回は、1列(0からなので2番目)のname
を呼び出すので、このビューを表示した際には、ダンスマスターズ
が出力されるはずです。
rails s
してlocalhost:3000/visitor/json
を開いて、ダンスマスターズ
が表示されていれば、ここまで正常に動いたことになります。
あとがき
とりあえずJSONファイルを読み込んで、配列として扱うことはできました。
今日は眠いので、また今度繰り返しのやり方を勉強して、続編を書きたいと思います。