音楽も甘いものとしょっぱいものを交互に聴きたくなる的なのある
色々環境が変わってあまり書く時間がなくなってしまった。
いかんいかん。
エロフェス行ってから最近仕事中によく打首獄門同好会聞くようになった。
そして88のどうでしょう再現度が完璧すぎてやばいwww.youtube.com
けどずっとこれ聴いているとくどくなってくるので、たまに星野源。
ポテチとチョコを交互に食べるあれね。
あーコードかきたい
クッキーとかセッションとかよく聞くけどいまいちわかってなかった
状態管理してみる
サービスをWeb上にアップしたのはいいものの、誰が作ったかぐらいはわかるようにしたい。
けど、ユーザ管理とか面倒なのでやりたくない。
ふーむ、どうしたものか、と考えて基礎の本を読んでたら、
「状態管理」という項目がありました。
クッキーとかセッションとかのやつ。
そうだ!これを入れてみよう!!
というわけで頑張ってみよう。
qiita.com
とりあえずはこれを参照。
モデルを作成、セッションにuser ID挿入
IDを入れるためのuserテーブルを作成する。
$ rails generate model user name:string lastlogin:date invoke active_record create db/migrate/20151020073924_create_users.rb create app/models/user.rb invoke test_unit create test/models/user_test.rb create test/fixtures/users.yml $ rake db:migrate == 20151020073924 CreateUsers: migrating ====================================== -- create_table(:users) -> 0.0020s == 20151020073924 CreateUsers: migrated (0.0021s) =============================
で、
[ application_controller.rb ]
before_action :login def login # new session if session[:user_id].blank? user = User.create session[:user_id] = user.id end @user_id = session[:user_id] end
とりあえずこれで、新規セッションの場合には
「user IDを発行 → セッションに挿入」
というフローができました。
次はこれを他テーブルの要素にも入れる必要があるんだよなぁ。
既存テーブルにカラムを追加する
ruby on railsのデータベースのテーブルにカラムを追加、削除する
基本的には「Addカラム名Toテーブル名」でいけるもよう。
$ rails generate migration AddUser_idToAnime_titles user_id:string invoke active_record create db/migrate/20151020084600_add_user_id_to_anime_titles.rb b-kt-01:musico kt$ rake db:migrate == 20151020084600 AddUserIdToAnimeTitles: migrating =========================== -- add_column(:anime_titles, :user_id, :string) -> 0.0009s == 20151020084600 AddUserIdToAnimeTitles: migrated (0.0010s) ==================
ってやったら、カラムの順番が一番最後になってしまって、ちょっとイケてない。。。
削除してやり直そう。
と思ったらマイグレーションファイルに追記すればいいだけだった。しにたい。
もういちどやりなおし
モデルを削除してマイグレーション
$ rails generate migration RemoveUser_idFromAnime_titles user_id:string invoke active_record create db/migrate/20151020085338_remove_user_id_from_anime_titles.rb $ rake db:migrate
モデル削除用のマイグレーションファイルがあるとモデル作れないのでデリる
$ rails destroy migration RemoveUser_idFromAnime_titles invoke active_record remove db/migrate/20151020091023_remove_user_id_from_anime_titles.rb
カラム追加のマイグレーションファイルを強制上書き
(identicalってなるので2回やった)
$ rails generate migration AddUser_idToAnime_titles user_id:string --force invoke active_record remove db/migrate/20151020090845_add_user_id_to_anime_titles.rb create db/migrate/20151020091329_add_user_id_to_anime_titles.rb
"after: "をつけてもっかいやってみる
$ rake db:migrate == 20151020091329 AddUserIdToAnimeTitles: migrating =========================== -- add_column(:anime_titles, :user_id, :string, {:after=>:icon}) -> 0.0023s == 20151020091329 AddUserIdToAnimeTitles: migrated (0.0024s) ==================
ってできてねえ!!なんでやねん!!
マイグレーションをロールバック
とりあえずマイグレーションをロールバックできるコマンドがあったのでいそいそと戻す。
$ rake db:version Current version: 20151020091329 $ rake db:rollback == 20151020091329 AddUserIdToAnimeTitles: reverting =========================== -- remove_column(:anime_titles, :user_id, :string, {:after=>:icon}) -> 0.0134s == 20151020091329 AddUserIdToAnimeTitles: reverted (0.0236s) ================== $ rake db:version Current version: 20151020091023
なんかマイグレーションファイル消したり強制上書きしたのでバージョンがおかしい。
よくわからないのでもう初期化しよう。
初期化してafterつけたのマイグレートしたのにできてないんだが?
なぜだ。なぜできないのだぉぉぉぉ
あきらめますた。
gitをもうちょっとクールにつかいたい
これまでは、git push origin masterで全部本チャンにぶちこんできてたけど、
そろそろブランチとかそういうプロジェクトっぽい機能使ってみたい。
というわけで頑張ってみる。
トピックブランチと統合ブランチでの運用例【ブランチ】 | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ
猿並みの自分でもよくわかりました。
とりあえず、developブランチがあればいいかな。
ブランチを作成
$ git branch * master $ git branch develop $ git branch develop * master
developにチェックアウト
$ git checkout develop Switched to branch 'develop' $ git branch * develop master
うん変わってる。
コミット
適当なファイルにコメントアウトして変更を加え、コミットする。
$ git add app/views/home/about.html.erb $ git commit [develop 3971b26] テストでコメントアウトしてみる 1 file changed, 2 insertions(+)
ブランチをマージ
マージは親ブランチでやる必要があるので、一旦masterに入ってから実施すること。
$ git checkout master Switched to branch 'master' Your branch is up-to-date with 'origin/master'. $ git branch develop * master
確かに書いたコメントがなくなってる。
$ git merge develop Updating 0ae9760..3971b26 Fast-forward Auto packing the repository in background for optimum performance. See "git help gc" for manual housekeeping. app/views/home/about.html.erb | 2 ++ 1 file changed, 2 insertions(+)
削除は。。。多分しないから、まだいいかな。
ETERNAL ROCK CITY 2015 行ってきました
通称エロフェス。
エターナルロックシティだから略称はエロシティな気もするけど。まぁフェスだし。
というわけでもっとナウなヤングにバカウケのミュージックとはなんぞや
というのを合言葉にサーキットフェスにいってきました。
ヤーシブですよヤーシブ。
ホテル街のど真ん中に鎮座するO-EASTとO-WESTを行ったりきたり中臣鎌足してました。
チョイスしたバンドがアレだったのか、ジャンルがなかなか統一感のないカオスな状態で
それはそれでとても面白かったのですよ。
ほとんど初見のバンドだったのもあり新鮮。ロキノン系なのかな。どうなのかな。
あと全体的に女の子が多かったからか、一部のバンド以外はみんな大人しかった。
結構いろんなバンドがコール&レスポンスしようとしてたけど、そこまでウオアーもせず。
以下見たバンド。
Kidori Kidori
音源聞いて一番みたかったバンド。ライブだとエフェクトの関係なのかまた違って聞こえた。
昔と比べて最近はかなり曲調変わってるけど、最近のが評価されてる、らしい。www.youtube.com
夜の本気ダンス
テレフォンズとカナブーンを足して2で割った感じ。ちゃんとダンスしてる曲だった。
ボーカルがかっこいいのび太だった。ドラムがチンピラだった。www.youtube.com
やっぱり音楽って本当にいいですよね。
それではこのへんで。さよなら、さよなら、 さよなら
ちょいちょい見た目の手直しをする
fixtureでハイフン使うとエラーが起こる
$ rake db:fixtures:load rake aborted! ActiveRecord::Fixture::FormatError: a YAML error occurred parsing /Users/xx/xxxx/musico/test/fixtures/anime_details.yml. Please note that YAML must be consistently indented using spaces. Tabs are not allowed. Please have a look at http://www.yaml.org/faq.html
どうやらエスケープしないといけないもよう。はい。
と言っても "" で囲むだけなんだけど。
タイトル一覧テーブルのページを追加
タイトルを一覧で削除するところがなかったので、scaffoldぽくテーブルを作って編集削除できるインデックスページを作る。
[aninme_title_controller.rb]
... # GET /anime_titles/titlelist def titlelist @anime_titles = AnimeTitle.all #renderよりも先に書いておく render layout: 'applicationtitles' end ...
[titlelist.html.erb]
※ファイル作っただけなのでブランクページ。
ってコントローラとビュー作ってみたものの、ルーティングでエラー。
新しくアクションを追加する方法ってどうやるんだ。
アクション追加はルートを編集
routes.rbでタイトルの中に一覧ページへのルートを指定するべし。
memberとcollectionの違いについては、
「複数形はidなし、単数形はidあり」と同じ考え方で、「collection(集合)はidなし、member(個別)はidあり」と覚えましょう。
今回は一覧なのでid振ってページ複数作らない → collectionでよさそう。
[routes.rb]
resources :anime_titles do resources :anime_details collection do get :titlelist end end
$ rake routes ... titlelist_anime_titles GET /anime_titles/titlelist(.:format) anime_titles#titlelist ...
ルート作れました。
ページ内容
基本的にはanime_detail/indexのコピペ。
グリッドは多分おかしいけど、とりあえず表示できればいいので放置。
<div id="animetitlewrap" style="background-image: url(/assets/back.jpg);"> <div class="container"> <div class="row"> <div class="col-lg-6 col-lg-offset-3"> <h1>アニメタイトルリスト</h1> <h4>主に確認用</h4> </div> </div><! --/row --> </div> <!-- /container --> </div><! --/headerwrap --> <div class="container"> <h1>Listing Anime Titles</h1> <p id="notice"><%= notice %></p> <div class="table-responsive"> <table class="table table-striped table-bordered table-condensed newline"> <thead> <tr> <!-- ヘッダ --> <th colspan="1"></th> <th class="col-xs-2 col-ms-2 col-md-2 col-lg-1">ID</th> <th class="col-xs-2 col-ms-2 col-md-2 col-lg-2">title</th> <th class="col-xs-2 col-ms-2 col-md-2 col-lg-3">icon_url</th> <th class="col-xs-1 col-ms-1 col-md-1 col-lg-1">icon</th> <th class="col-xs-2 col-ms-2 col-md-2 col-lg-2">created_at</th> <th class="col-xs-1 col-ms-1 col-md-1 col-lg-2">updated_at</th> </tr> </thead> <tbody> <% @anime_titles.each do |anime_title| %> <tr> <!-- anime_titleリスト %--> <td class="col-xs-1 col-ms-1 col-md-1 col-lg-1"> <%= link_to '表示', action: :show, id: anime_title.id %><br> <%= link_to '編集', action: :edit, id: anime_title.id %><br> <%= link_to '削除', {action: :destroy, id: anime_title.id}, {method: :delete, data: {confirm: '削除してよろしいですか?'}} %> </td> <td class="col-xs-2 col-ms-2 col-md-2 col-lg-1"><%= anime_title.id %></td> <td class="col-xs-2 col-ms-2 col-md-2 col-lg-2"><%= anime_title.title %></td> <td class="col-xs-2 col-ms-2 col-md-2 col-lg-3"><%= anime_title.icon_url %></td> <td class="col-xs-1 col-ms-1 col-md-1 col-lg-1"><%= anime_title.icon %></td> <td class="col-xs-2 col-ms-2 col-md-2 col-lg-2"><%= anime_title.created_at %></td> <td class="col-xs-1 col-ms-1 col-md-1 col-lg-2"><%= anime_title.updated_at %></td> </tr> <% end %> </tbody> </table> </div> </div> <br> <%= link_to 'New Anime Title', action: :new %> <hr> <%= link_to 'アニメタイトル一覧', anime_titles_path %> | <%= link_to 'トップへ', root_path %>
コントローラで自ら開けた穴にハマる
scaffoldで作ると作成されるprivateメソッドの「set_anime_title」が反応してエラー出てる。
「AnimeTitle.find(params[:id])」のidがねーぞ、って。ここ読まなくていいのになんで反応してるん。
と思ってたら
before_action :set_anime_title, only: [:show, :edit, :update, :destroy, :titlelist]
自分で読み込むようにbefore_actionに追加してたってオチ。馬鹿か。
:titlelist消したら表示できました。めでたし。
タイトル一覧では最新のものから表示させる
現状はanime_titleのID順(DB入った順?)でゴリゴリ表示させてるんだけど、これを登録タイミング順にする。
って調べてみたけど、titlelistの場所でだけ、みたいに特定の場所で取り出し順序変える方法がわからぬ。
どうせID順で使うことないし、とりあえずdefault_scopeを使ってモデル自体の取り出し順序を変える。
[models/anime_title.rb]
class AnimeTitle < ActiveRecord::Base has_many :anime_details, dependent: :destroy accepts_nested_attributes_for :anime_details default_scope { order("created_at DESC")} end
DESCをつけることで、最新順になりました。
副次的にindexとかいろんなページのリストが最新順で表示された。
トップページは最新6件のみ表示する
今はrootであるhome#indexと、anime_titles#indexではほぼ同じ内容を表示している。
これをトップページでは件数制限をかけて、「もっと見る」とかで全部見れるようにしたい。
ループ指定は「.first(取得する個数)」をeach doに追加すれば頭から取ってこれる。カンタン。
「もっと見る」はとりあえずボタンを置いとけばいいや説。
んで、変更したものは_newestの部分テンプレートにして、_highlightから差し替え。
[ home/index.html.erb ]
<div id="headerwrap"> <div class="container"> <div class="row"> <div class="col-lg-6 col-lg-offset-3"> <h4>HELLO PEOPLE, MY NAME IS MUSICO!</h4> <h1>アニメのOPとEDをあつめるところ</h1> <h4>とりあえずつくってみた</h4> </div> </div><! --/row --> </div> <!-- /container --> </div><! --/headerwrap --> <section id="works"></section> <div class="container"> <div class="row centered mt mb"> <h1>New entry Anime Titles</h1> <%= render partial: 'newest', locals: { anime_titles: @anime_titles } %> </div><! --/row --> <div class="row centered mb"> <div> <%= link_to('タイトルをもっと見る', {controller: :anime_titles, action: :index}, :class => 'btn btn-default btn-lg' ) %> </div> </div> </div><! --/container -->
[ home/_newest.html.erb ]
<!-- list 6 newest image --> <ul> <% anime_titles.first(6).each do |anime_title| %> <div class="col-lg-4 col-md-4 col-sm-4 gallery backgroundbrink"> <%= link_to({:controller => "anime_titles", :action => "show", :id => anime_title.id}) do %> <div style = "background: url(<%= anime_title.icon_url %>) 50% 20% no-repeat; background-size: cover; width: auto; height: 250px;"> <div class="btn btn-success thumbbutton"> <%= anime_title.title %> </div> </div> <% end %> </div> <% end %> </ul>
なんとか形になりまっした。
herokuでデプロイしたけどよくわかってなかった
herokuでデプロイ完了したけどプランとかどういう体系なのか全然確認できてなかったので確認する。
最近変わったのね。
Freeプランの変更内容・影響
一番ユーザ数的にインパクトがあるのは無料プランの変更でしょうか。30分アクセスがなければDynoがSleepするというのは今まで通りですが、「1日6時間以上スリープする必要がある」と変更になっています。
これってこっちでスリープする時間帯を指定できないのかな。
自分が使いたい時に使えないのアレだし。
というのは誰しも考えることで、Process Schedulerというアドオンがあるもよう。
設定しようとしたら「クレカ登録しないとアドオン使いないんでゲスよ(ゲス顏)」と言われた。
もしやこのアドオン、お金がかかるのでゲスか?
まぁとりあえずクレカ設定してみて、Process Schedulerをアドオンしてみる。
アプリのAPIキーとか聞かれる。ちょっと怖い。
が、普通にそれっぽく使えました。2:00 ~ 8:00をスリープ期間にする。
多分これで大丈夫、な、気がする。
herokuに上げたらニコニコ動画が取ってこれなくなった〜httpsは魔物でござるの巻〜
はてさて無事herokuにデプロイはできたのですが。
いざデータを入れてみると、youtubeエンベッドはできたのですが、ニコニコのエンベッドが動かない。
デプロイするときに色々消したのがまずったのかな…と思ったけど、ローカルでは普通に動いてる。
Developerツールを覗いてみると、以下のエラーが。
Mixed Content: The page at 'https://musico.herokuapp.com/anime_titles/9' was loaded over HTTPS, but requested an insecure script 'http://ext.nicovideo.jp/thumb_watch/sm8539552'. This request has been blocked; the content must be served over HTTPS.
httpsとhttpがミックスコンテンツ。
。。。。。。
プロに聞いたところ。
基本的にhttpsはセキュアにする性質上、httpsからhttpのサイトを呼び出すことはできない。
んで、herokuではhttpでもhttpsでもどっちでも対応しているんだけれども、デプロイ後のリンクはhttpsで張られているため、期せずしてhttpsでページを見ていたようです。
httpでアクセスしなおしたところ、表示されました。
ちなみにプログラムの中でURLソース指定するときには、
<script type="text/javascript" src="//ext.nicovideo.jp/thumb_watch/<%= $1 %>"></script>
というように、頭のhttp部分を抜くと、自分のページに依存させることができるらしいです。
(呼び出し元のページがhttpならhttp://~~~、httpsならhttps://~~~、といった形)
とりあえず、http環境では動いたのでよしとします。