コードを書いてくらす

プログラミングについて書いてます。

Ruby on Railsのチュートリアルをやってみる

あまりあれこれと手を出すのもどうかと思うんですが、前からちょっと気になっていたので。

railstutorial.jp


とりあえず1章が終わって2章に取りかかっています。が、フレームワークが便利すぎてほとんどやることありません。scaffold(仮設)までぱぱっとできてしまいました。
2章からは任意の動作を実装しているので、ここからフレームワーク全体を把握できる感じですね。ルーティング、アクション、レンダリングCRUD機能の自動構築などなど、大まかな動作はphp習得でもやったcakePHPとあまり変わらないように見えます。


それとチュートリアルで指示があったようにbitbucketとherokuのアカウントを取得しました。
bitbucketはgithubと同種のサービスですね。公開・非公開の条件がそれぞれで違うようなので使い分けたいですね。
それとherokuというものを知らなかったので使ってみてちょっと驚きました。デプロイをサポートするPaaSの一つ、だそうです。もう少し使ってみないと分からないけど、なかなか便利そうです。


それとチュートリアルではCloud9での説明もありました。ここから知って使っている人も多そうですね。webプログラミングはずっとCloud9を使っているので、今回もここでチュートリアルを進めています。このサービスも便利で優れたサービスですね。


今日はこの辺で。

cakePHPで在庫管理サンプル その2

前回に続き在庫管理サンプルに機能を追加しました。

  • レシピメニューで複数の在庫を確認

こんな感じで複数の材料の在庫が確認できます。
f:id:matildatilda:20160217194126p:plain


今回のソースコードはこちら:
https://github.com/matildatilda/stocksample


未実装の機能としては、

  • 在庫一覧、在庫追加は管理者のみアクセスできること
  • レシピメニューで3つ以上の材料確認ができること(入力項目数の可変化)
  • レシピメニューで一括出庫ができること

です。

今回のポイントは配列で入力項目を受け取ること、でした。
HTML側では

<input type="text" name="ingredients[0][item_name]" />
<input type="text" name="ingredients[0][volume]" />

で、PHP側というかcakePHP側では

$ingredients = $this->request->data['ingredients'];

で受け取れます。
$ingredientsは配列なので、バラしてさらに

$ingredient['item_name']

の形でデータにアクセスします。

今日はこの辺で。

在庫管理サンプルを作ってみます

cakePHPをベースに在庫管理システムのサンプルを作ってみます。
機能は以下の通り。

  • 在庫入力:材料名(容量、単位)、数量、入庫日を登録
  • 在庫情報編集:登録済み情報の編集
  • 出庫:材料の数量を減らす

今回はbakeコマンドを使わずに手作業で追加しました。
作成したクラスやファイルは以下の通り。

  • Stocks(データベステーブル):材料名、容量、単位、数量、入庫日を持つテーブル
  • StocksTable(モデルクラス):Stocksテーブルのモデルクラス
  • StocksController:Stocksのアクションを実装するコントローラークラス
  • index.ctp:在庫一覧を表示するテンプレートファイル(/Stocks)
  • add.ctp:在庫追加の画面用テンプレートファイル(/Stocks/add)
  • edit.ctp:登録済み情報の編集用テンプレートファイル(/Stocks/edit)
  • issue.ctp:出庫画面用テンプレートファイル(/Stocks/issue)

画面はこのような感じで。
f:id:matildatilda:20160203140550p:plain
f:id:matildatilda:20160203140600p:plain
f:id:matildatilda:20160203140606p:plain

ソースコードはこちら(実装分のみ)
https://github.com/matildatilda/stocksample


先週、本を見ながらフレームワークを実装したのがかなり良かったのか、さほどつまづかずにすんなりと作成できました。

課題として見えてきたのは

  • テーブルクラスの操作(patchEntity, saveなど)を把握すること
  • テンプレートでできることを把握すること(CSSの設定、JavaScriptの動作など)

です。

実はコントローラークラスを作ってしまった後からStocksテーブルに列(volume, unit)を追加したのですが、1行もコードを修正することなく動作していますね。普通ならSQLまわりで修正もれが出てきそうですが。こういう手軽さはとても楽ですが、思わぬところで動作不良が起きていても気づかなかったりしないか少し不安です。

cakePHPにはテスト環境もあるみたいなのでそちらも少し調べる予定です。

次回は、複数の出庫を一度に行うrecipeアクション(例:「ケーキ」を選択したら小麦粉、砂糖、バターなどをまとめて出庫)を実装する予定です。あと見た目も少し変えたい。

今日はこの辺で。

ブログサンプル 完了

細かな不具合がありますがとりあえす完了しました。

https://github.com/matildatilda/blog-sample

javascriptフレームワークにAngular.jsを使っているけど、最初の印象より使いにくい気がします。コンセプトをきちんと理解していないせいもありますが。でもView側の変数の制御や便利なところもあるので、どうしようか考え中です。他のフレームワークを調べてみる予定。

今回の作業ではPHPの習得も視野に入れていたのですが、cakePHPを使うつもりがあれこれやっているうちに結局使わなかったりして、あまり進んでいません。

なので、「パーフェクトPHP」を見てフレームワークの実装、簡単な投稿サイトを作成しました。

パーフェクトPHP (PERFECT SERIES 3)

パーフェクトPHP (PERFECT SERIES 3)


この本、なかなかいいですね。一通り実装してバグ取りをしたので、解説と共にコードリーディングを進めます。
次はcakePHPで作成されたコードを読みながら、課題を探す予定です。

今日はこの辺で。

ブログサンプルの経過

更新が空いてました。
前回からブログサンプルを作成しています。今日はログインまわりを少し整理しつつ、各画面の見直しをしました。

  1. ログイン画面:ユーザー、パスワードを入力する。ログイン中、未ログインの状態(ログイン状態)を更新する。
  2. リスト表示画面:ブログ記事のリストを表示する。(各リスト要素はリンク)ログイン中の時、新規作成ボタンを表示。
  3. 詳細画面:ブログの詳細を表示する。ログイン中の時、編集ボタンを表示。
  4. 新規作成画面:タイトル、記事を入力する。
  5. 編集画面:タイトル、記事を入力可能状態で表示する。削除ボタンを表示。

各画面はそこそこできているんですが、画面の切り替えや切り替えに伴うデータの受け渡しがまだうまく実装できていません。動作も思ったように動かない部分がいくつかあります。

次回は機能面からcontrollerやserviceを見直す予定です。

今日はこの辺で。

PHPをやるはずがJavaScriptにはまる

PHPでデータ接続と、取得したテーブルの内容をJSONで返す簡単なメソッドを備えたモデルクラスを作成しました。リクエストに対応したメソッドを起動させるために、ルーティングというものを少し調べてみました。まだよく分かっていませんが、cakePHPなどはこういう機能がかなり作り込まれている感じなんでしょうかね。


さて、そこそこデータ(ブログの一覧)を返せるようになったところでクライアントサイドに戻ります。が、意外とhttpを使ったデータ取得がうまく行かずにけっこうはまりました。ボタンを押す、などのイベントドリブンで取得するのはOKなんですが、ページが表示されたタイミングでブログ一覧を表示させたかったんですね。


サービスを作ってhttp.getメソッドを発行するようにしました。ここは問題ないようなんですが、データ取得後にangular.jsのviewにバインドしたモデルが反映されなくて空白のまま…。

angular.jsではあまり$scopeを使わずに、contoroller内で定義したthisオブジェクトのプロパティをモデル用に使ったりしていました。ですが、今回はどうやら$scopeのプロパティじゃないとうまく表示できないようです。

thisと$scopeにどういう違いがあるのか調べてみないとこの後もはまりそうです。


今日はこの辺で。

ブログサンプルを作ってみる

cakePHPでやってみたんですが、あまりにも簡単にできてしまうので自分で作ってみることにしました。

cakePHPはテンプレートをカスタマイズしたりルーティングを追加したりすることでいろいろできそうですが、先にもう少しPHPに馴染んでおきたくて。というわけでまだソースを上げられるほど進んでませんが、MVCを意識して作っています。

あと、ここ最近ずっとwebアプリケーションばかりなので、モバイル方面も気晴らしにやってみようと思います。Code Schoolに入ってたiOSのフリーコースをちょっとやってみたけど、あっちはあっちでまた独特ですね。


今日はこの辺で。