Ruby on Rails tutorial +alpha(5)マイクロポストもカレンダー上に表示&マウスオンでポスト表示
注意:この記事はメモなので、この記事に書いてあることをやっただけでは同じものができません。(大体の雰囲気は書いてあると思います。)
注意:全くのweb開発初心者なので、間違っているところなどがあるかと思いますが、教えていただけると嬉しいです。
naomi-notebook.hatenablog.com だいぶ出来てきたので、今まで作った機能をおさらいして、次何をやるか考えます。考えて実装したら続きを書きます。
機能として必ず必要なもの
当たり前ですが、eventを作成する画面を作る(とりあえずフォームで、それができたらもっと優れたやりやすい方式で)eventを後から変更する画面を作る
使いやすさの面で必要そうなもの
- eventをタイマーなどでリアルタイムに作成できるようにする(studyplusアプリのアレみたいなイメージです)
- カレンダーをドラッグするなどしてもっと簡単に記録が作れるようにする
カレンダー上の予定をクリックすると編集画面が出てくる- eventtype>4とタイトルの組み合わせを自分で設定できるようにする
- eventtype=1の睡眠データを集めてグラフかなんかに表示できるようにする
生活記録表として必要な要素
- 睡眠とベットに入っているだけを分ける
all-dayに気分の記録ができるようにする→type=0の時jsonにallday属性を作ることで解決しました。
個人情報の扱い的に正しそうなもの
ログインした時やフォローされている時しかevents/(user_id)/eventsでjsonデータが返されないようにした方が個人情報的には良さそうです上に付随して、フォローされるのを許可制にできるようにする- マイクロポストもフォロワーにしか見られないようにする
- 自分でアカウントが消せるようにする
スケーリングのために必要そうなこと
- fullcalendarが/users/(user_id)/eventsにアクセスするときに全てのuser.eventsを取得するのではなく、endtimeがstartより後、またはstarttimeがendより前のもののみ取得する(whereとかを使えそう)
その他
- micropostをチュートリアルで作っちゃったのでその有効な活用方法を考える笑→メモを残した時間がカレンダー上に表示され、それをクリックとかするとマイクロポストが表示される、とか…?
micropostが持て余し気味なのでmicropostを改造していこうと思います。
git checkout renew_micropost
まず、自分でないかつフォローしてないとmicropostをshowで表示しないようにします。(viewを変えればすぐできます。)
次に、自分またはフォローしている時にmicropost一つ一つの内容を返すページを作ります。micropostの内容をクリックするとmicropostのページに飛ぶようにしてみます。
def show @micropost = Micropost.find(params[:id]) if current_user && ( @micropost.user_id == current_user.id || current_user.following.include?(@micropost.user_id ) ) #フォローしていれば返す @micropost else redirect_to root_url end end
routes.rb
resources :microposts, only: [:create, :destroy, :show]
次に、eventsと一緒にjson出力するようにします。
json.array!(@microposts) do |micropost| json.id micropost.id json.micropost true json.title "ポスト" json.start micropost.created_at json.end micropost.created_at json.color "lightblue" end
次に、micropost==trueの時はクリックしてもevent編集画面には飛ばないで、micropostの画面に飛ぶようにします
eventClick: function(info) { if(info.event.extendedProps.micropost){window.location.replace("/microposts/"+info.event._def.publicId);} else{window.location.replace("/events/"+info.event._def.publicId+"/edit/");} }
次に、これをちょっと変えて画面内に表示するようにします。 jQueryのAjaxを使って外部HTMLの一部を抜き出し挿入する - Qiita
javascript - Jquery filter not working with jquery object - Stack Overflow
これらを参考にしました。(filterは子要素を見つけられないみたいだった…)
eventMouseEnter: function(info) { if(!info.event.extendedProps.micropost){return;} url="/microposts/"+info.event._def.publicId; $.get(url,{}, function(data){ var html= $($.parseHTML( data )); mnumber="#micropost-"+info.event._def.publicId $("#box_load").empty(); $("#box_load").append(html.find(mnumber)[0]); }); }, eventMouseLeave: function(info) { if(!info.event.extendedProps.micropost){return;} $("#box_load").empty(); }
#box_load { width: 100%; height: auto; position: absolute; z-index: 9999; box-sizing: border-box; word-wrap: break-word; top: 0; left: 0; overflow-y: auto; overflow-x: auto; background: white; }
これでカーソルがポストの上にある時にポストをカレンダーに重ねて表示することができるようになりました。(本当はもっとかっこよくホバーしてくるように作りたいのですが、cssが難しい…)