職場実習23日目
2日連続で寝坊しました。すみません。
色々見直さないといけないかも。
今日はレビューの日。開始時間は終業近くになるので、それまでに最後の仕上げと準備を整えなければいけない。
大方できてはいるし、見せられる状態だけど、まだ何か足りない気がする。
ソート処理
作成者ドメインとアイテムドメインは1対多の関係があり、作成者情報画面から、投稿したアイテム(作品、シリーズ、ジャンル)がリストで表示される。
その際、初期状態では雑然と並んでいるが(おそらくID順に並んでいるのだろうが)、名前順にソートされているほうが見栄えが良くなる。
そこで、リスト表示を最初からソートして表示する方法を考えてみた。
・ドメインにソートの設定をする。
・コントローラーでソートの設定をする。
・ビューでソートの設定をする。
ドメインを弄るとデータが飛んでしまう恐れがあるので、まずはビューを弄ってみる。
インスタンスフィールドに含まれるリストのソート処理(ビュー)
<g:each var="s" in="${authorInstance.stories.sort{[it.title,it.dateCreated,it.lastUpdated,it.id]}}"> <li><g:link controller="story" action="show" id="${s.id}">${s?.title}</g:link></li> </g:each>
上は、以前のバージョンで作品をソート表示した時のソート設定。インスタンスのフィールドにsortメソッドで定義している。優先順位は、タイトル、登録日時、更新日時、IDの順。
下は、今回のバージョンでアイテムをソート表示するための設定。上と同じ感じにしてある。
<g:each in="${authorInstance?.items.sort{[it.title,it.dateCreated,it.lastUpdated,it.id]}}" var="itemInstance"> <li><g:link controller="item" action="show" id="${itemInstance.id}">${itemInstance.encodeAsHTML()}</g:link></li> </g:each>
<g:each in="${seriesInstance?.stories?.sort{[it.title,it.dateCreated,it.lastUpdated,it.id]}}" var="storyInstance"> <li><g:link controller="story" action="show" id="${storyInstance?.id}">${storyInstance?.encodeAsHTML()}</g:link></li> </g:each>
・・・しかし、ソートされない。前のバージョンはソートされたのだが。ソース上の相異点をつぶしても結果は同じだった。
ソートテーブルのソートを初期状態から行う処理(コントローラー)
listアクションのクロージャー内でパラメータを設定する。これで最初からタイトルで昇順ソートされた状態になる。
def list = { params.max = Math.min(params.max ? params.max.toInteger() : 10, 100) params.sort = "title" params.order = "asc" [storyInstanceList: Story.list(params), storyInstanceTotal: Story.count()] }
文字を大きくする
Grailsのテンプレートのままだと、文字が少し小さいので、レビュー時にスクリーンに投影すると周りに見えづらい。そこで、web-app/cssフォルダのcssファイルを弄って、文字サイズを大きくしてみる。
cssファイルの中身をのぞくと、フォントサイズが全てpx単位で指定されているので、pt単位に変える。
すると、文字は全体的に大きくなったものの、行間が詰まりすぎてて、一部文字が重なってしまってる。
そこで、今度はpadding等をpxからpt単位に変えてみる。すると、行間も丁度良くなり、全体的にバランスが良くなった。
しかし、ソートテーブルの見出し行の高さが増えるため、背景画像の高さと合わず、見た目が少しだけ崩れてしまった。最初はあまり気にならないが、気になりだすと、放ってはおけない。レビューまでに解決法が見付からなかったので、これは後で考えよう。
レビュー前にバグが・・・
ログインしていない状態で、作成者登録しようとするとログイン画面に変わり、登録されないという致命的なバグが発生した。最初は、作成者登録後に、登録したアカウントでログインしようとするとログインできないエラーが出たので、管理者ログインした後、作成者一覧を見て、登録されているかを確認したら、登録が行われていない事が分かった。
ログイン管理をするときに、セッションの時間切れになった後にログイン中の処理にアクセスすると自動的にログイン画面に遷移する処理を追加したのを思い出し、作成者ドメインを登録するアクションを調べたところ、そこにも追加されていた。
管理者ログイン中にセッションが時間切れになった場合を想定して、処理を置いたのだが、こんなバグの元になっていたとは。とりあえず、外して置いた。
レビュー
発表内容は以下の通り
- サイトの趣旨
- サイト名:SSBBS
- 趣旨:ショートストーリーをユーザーに投稿してもらう事で作り上げるサイト
- 作成者ログイン中の処理
- 作成者ログイン
- アイテム(作品・シリーズ・ジャンル)の一覧表示と内容表示
- アイテムの追加・更新・削除
- 作成者情報の表示・編集
- ログアウト
- 作成者アカウントの登録・編集・削除
- 管理者ログイン中の処理
- 作成者一覧表示
- 作成者情報の表示・追加・編集・削除
- アイテムの一覧表示と内容表示
- 任意の作成者名義でのアイテムの追加・編集・削除
- 管理者ログアウト
- ログインせずに行える処理
- アイテムの一覧表示と内容表示
- 作成者情報(プライバシー部分を除く)の表示
- 質疑応答
感触は、前回のレビューと比べて上々であった。
指摘のあった所や質問など
- ログイン関連
- SS投稿サイトという趣旨はどうやって思い付いたのか(奥村さん)
- 既存のBBSのSS投稿スレッドなどで、SS投稿そのものは行われているが、自分の知る限りではSS投稿専門のサイトというのは見たことが無かった。また、同じ研修生のK君が制作している書籍レビューサイトに触発され、アイデアがひらめいた。
- 難しかった所など(金村さん)
- 作成者とアイテムで1対多の関係を作った時に、作成者情報画面にアイテムリストが自動生成されるが、アイテムリストをソート表示するのに手間取った。
- 作成者とアイテム(作品・シリーズ・ジャンル)で1対多の関係、ジャンルorシリーズと作品で1対多の関係、ジャンルとシリーズで1対多の関係を作るのに、ドメインクラスの派生クラスを作るなど、色々な工夫を行うのに苦労した。
レビュー終了
レビュー後に、パンフレットの自動組版ソフトについて色々教えてもらった。
GrailsとAjaxとExtJSを組み合わせて作られているらしい。
パンフレットの1コマに使うPDFを自動で生成するWebアプリで、フォームから必要な情報を入れるだけで出来上がるらしい。
フォーム入力項目はJSONで記述されており、テンプレートの書式に応じてJavaScriptでフォームを自動生成する仕組みになっている。
これを使えば、広告を載せたい客(お店など)の目の前でサイトに繋いで、その場で情報を入力して、レイアウトを目視確認してもらう事も可能。
研修終了
これで職場実習は全て終わりなので、社員の方々に挨拶をして、会社を後にした。
明日はいよいよ職業訓練の終了式。
しかし、ここで大事な事を忘れているのを思い出した。
訓練日誌の9月分をまだ確認してもらっていない。印鑑を押して貰わないといけないのに。
終了式後にまた会社に行く羽目に・・・。(行きたくないわけじゃないけど、こんな事で行くなんて恥ずかしいし、社員の方々に迷惑かかるのはやだなぁ)
やり残し
作成者登録処理での、セッション時間切れによるログアウト時の処理はやはり必要である事が分かった。
前は、セッション情報の中にある作成者IDが見付からない時に強制的にログイン画面に遷移していたが、管理者ログイン中に時間切れでログアウトとなった場合と、ログイン前の状態とを区別していなかったために、ログイン前に作成者登録できなくなるというバグが発生していた。
しかし、セッション情報が消えている状態で管理者ログインとログイン前を区別できるのだろうか…。
いっその事、セッション情報として、ログイン状態(TRUEかFALSE)も作っておき、FALSEの時はログイン前、状態が無い時はセッション時間切れという事にしてしまうのがいいだろうか。
しかし、サイトを開いた時にログイン状態を初期化するのはどうやればいいのだろう。考える事はまだまだある。
やはり、最初にログイン関連のプラグインを使うべきだったんだろうな。
ログイン状態を作成者IDの有無で判断する仕組みにしてしまったのは痛い。そういうのを考える煩わしさから少なからず解放されるように、プラグインに頼ったほうがいいのだろう。