LoginSignup
0
0

More than 3 years have passed since last update.

Day12 微修正

Last updated at Posted at 2020-03-15

コメント欄に運営アイコンと非表示ユーザアイコンを表示、削除済ユーザのコメント表示

完成後
image.png
image.png
問題
コメントしたことのあるユーザが削除された場合というのは想定ができておらず、コメント欄に削除ユーザの名前が残り続けてそこをクリックすると、当然そのIDはないのでエラー画面が出てしまう。もちろんBefore_Actionで制御ができるが、見た目も削除されたユーザは非表示等にする必要があった。
工夫した点
アイコンを表示する際に、例えばuser.admin?等のメソッドを使うことになるが、もしコメント欄に削除済のユーザがいた場合、その処理はeach文のなかなので削除済のユーザのIDに対しても.admin?が行われてしまい、エラーが出てしまう問題が生じた。
そこで、以下のように回ってきた変数がnilではない時のみ、.admin?や.private?といったインスタンスが前提のメソッドを使うように工夫することで問題は解決できた。
image.png
また、非公開ユーザのコメントも許可する仕様なので、公開ユーザは非公開ユーザのプロフィールリンクへ飛ぶ可能性がある。もちろんアクセス制御はしているので”非公開ユーザーです”とでるのだが、リダイレクト先が今はIndexのみなのでそこも下のようにして分岐させた。昨日見つけたRequest Refererで元々いたページを取得し、それを条件式にし、自分のプロフィールページにいたときはそこに戻るようにした。ちなみにparamsには非公開ユーザのIDが入っているのでそこからとるとリダイレクトが無限に続くことになる。(Googleがエラーを出してくれる) 非公開ユーザIDアクセス→Privateで弾かれる→そのメソッドでまた非公開ユーザにリダイレクト→またPrivateで弾かれる・・・・となる。
image.png
→追記1 request.referer自体を変数展開すればリクエストを送った前のページを取得できるとわかったので下記のように変更。
スクリーンショット 2020-01-23 2.42.45.png
ちなみにrequest.refererの中身をビューでみてみるとこんな感じ。
image.png
これで他人のプロフィールをみていて、そこの非公開ユーザのコメントからそこに跳ぼうとしても、みていたページで注意メッセージがでるようになる。
request.refererを使わなければ、他人のページから非公開ユーザへのリンクには対応できなかった。
→追記2 変数展開は必要ないので、変数展開は削除した。(Rails Tutorialでもあった・・・。)

削除済ユーザへのアクセス制御

削除されたユーザにアクセスするリンクは配置されていないが、削除されたユーザのIDを直接URLに入れてアクセスされることが考えられる。
そこでBefore_Actionで投げられたURLのIDからユーザをチェックし、いなければ注意フラッシュを出すメソッドを追加した。なお、showアクションは、インスタンスを前提とするメソッド.private?などを使うBefore_action privateもフィルターとしてあるので、その前に存在チェックのBefore_actionを入れないと、存在しないIDからインスタンスが生成されようとしてそこからメソッドが実行されてPrivateのBefore_actionはエラーを吐いてしまうため、順番にも注意。
image.png
スクリーンショット 2020-01-22 20.00.29.png

一つのレコードだとグラフに表示されない問題(グラフ表示には少なくとも日付の違う二つのデータが必要)

原因?
いろいろなデータをLineチャートに入れてみて、Lineチャートに入るデータの形がXXXX-XX-XXの時、表示されない問題が発生することがわかった。したがってXXXX年XX月XX日に変更すると、一つのレコードでもちゃんと表示される。原因はよくわからないが、問題のトリガーはわかったので、日付が保存される時に型をXXXX-XX-XXからXXXX年XX月XX日に変換するメソッドを間に入れて解決した。
image.png
1 paramsには、XXXX-XX-XXの形で日付データが入っている。まずはそれをstrptimeで下記のように変換。
image.png
2 さらにそれをXXXX年XX月XX日の形に変換し、保存する。
image.png
http://song-of-life.hatenablog.com/entry/2018/12/05/131231
まとめると、XXXX-XX-XX → Wed,XX Dec XXXX → XXXX年XX月XX日に変換して保存することで、グラフに一つしかデータがないときに表示されない問題を解決することができた。
Cf
であればそもそもXXXX年XX月XX日でユーザに入力させて保存すればいいのだが、それをするにはdate_selectをinputで使う必要がある。そうすると、date_selectはdate型しか送れないので、現状String型を採用しているcalc_dateコラムに入れることができない。
calc_dateコラムは、pluckで取得する時に、date属性の値であればすべてXXXX-XX-XXに変換されてしまうので、Stringに変えたという背景がある。
よって、String型で、XXXX年XX月XX日で保存するには、上のようにするしかないと考えた。

グラフ登録の際、日付を予期しないフォーマットで送るとエラーが出る問題。

問題
グラフ登録フォームには、予め日付データがこのように格納されているが、もちろん消すこともできる。
image.png
そして消した場合に、コントローラのアクション側でこのような値を期待しているので、送られた空白や変な形の日付は、変換できませんといったエラーが発生してしまった。
image.png
解決
初めはなぜ空白なのにValidationが機能しないんだと思ったが、Validationが働くのは.saveが行われるときで、ここで問題になっているのはそこまでのアクションにある部分であった。
したがって、アクションが行われる前になんらかのチェックを実装する必要があると考え、以下のようなBefore_actionを実装した。
image.png
このメソッドは、正規表現を使って送られたparamsが、XXXX-XX-XXであるかどうかをチェックし、マッチしなければ下いたページに遷移させるというBefore_actionである。
これによって、ユーザがアクション内の期待する日付フォーマット以外を送ってきても、エラーの原因になる変換はBefore_actionにより行われず、エラーがでることはなくなった。
image.png
何も記入せず登録しても、下のようになる。変な値を送られてもこうなる。
image.png

自分のコメントを強調

完成後
image.png
ビュー
スクリーンショット 2020-01-23 3.09.05.png
投稿コメントのpost_idからUserを取得し、そのUserのIDがログイン中のユーザなら、つまり自分自身のコメントなら専用のCSSを適用するDivで囲っている。
CSS
image.png

全てビューで行っている。

これから

あとはHerokuにデプロイしたいのだが、存在しないURLを投げられた時にエラー画面が出てしまうのでそれをなんとかしたい。
それをしてからHerokuにデプロイする。目標は明日例外処理を解決して、明後日にはHerokuにデプロイしたい。多分画像アップロードとかグラフとかいろいろ問題が起きそうなので予習しておきたい。

気づいたこと

エラーを意識することの重要性

存在しないインスタンスからメソッドを使うとエラーがでるけど、存在しないユーザのインスタンスを生成したり、見つけたりするのではエラーはでない。

この記事でも何回かあったけど、このエラーは割とよく会うので、それをコーディングしている時から意識することで回避できるのではと思った。
例えばBefore_actionのcorrect_userチェックでは以下のように存在しないIDから探そうとしているがエラーは起きない。だけどこれを.admin?とかそういうメソッドを使うとそのインスタンスはnil or emptyではいけませんといったエラーが表示される。
image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0