前回に引き続き、こちらの Rails入門 の記事を進めていきました。
Scaffold機能について
コマンド1つでアプリケーションに必要なMVCを自動的に作成してくれるそうな。
前回はそれぞれの要素をコマンドで作成していきましたが、一括生成できるんですね。
rails generate scaffold モデル名
最初からデータベースのテーブルのカラムを指定する場合はこちら
rails generate scaffold モデル名 フィールド名1:データ型1 ...
コントローラの中身も定番なものが記述済みのようで‥これは素敵。。
いきなりデータベースのデータの追加フォームやら編集フォームやらが用意された状態になっているっぽいです。
なるほど、これがフレームワークというやつの姿なんですね!
ただ、自動で作成されたファイルやその記述がしっかりと理解できていないうちは頼らない方が良さそうとも思いました。「scaffold」についてググってみたらまさにそういった注意をされている記事が。
逆に言えば、MVCをなんとなく理解した後なら「良いお手本サンプル」として中身を追っていくというのは良さそうです。
あと、scaffoldで作成した後にデータベースを実際に作成してマイグレートを行う必要があるようなので忘れないようメモしておきます。
rake db:create
rake db:migrate
コントローラとアクション
引き続き Rails入門 の記事を進めていきました。その際のメモになります。
コントローラの作成コマンド
rails generate コントローラ名
アクションも同時に定義する場合
rails generate コントローラ名 アクション名1 アクション名2 ...
※この場合ビューも同時に作成され、routes.rb内にも記述が追加される
ちなみに、コマンド「rails server」は「rails s」で、「rails generate ~」は「rails g ~」で省略可能なんですね!めちゃ楽です。。
この時点で行っている様子を図にしてみました。
繰り返しコントローラの作成とテストを行う過程で、徐々に理解できてきました。
その後のステップの「別のアクション用のテンプレートを呼び出す」では、コロン「:」の位置を下記のように変えないとRails 5ではエラーが出るかと思います。
render action: => 'アクション名'
render 'アクション名' ※actionを省略可能
render template: => 'コントローラ名/アクション名'
render 'コントローラ名/アクション名' ※templateを省略可能
ちなみに次のステップの「nothing」は作用しなかったので調べたところ、Rails 5 から render メソッドの nothing オプションは使えなくなったそうです。
参考にさせていただいた記事はこちら。
代わりに以下のような記述を使う模様。
head :no_content ※こちらは私の場合うまくいきませんでした
render body: nil ※こちらで真っ白なページが表示できました
head :ok ※こちらも真っ白なページが表示できました
ステータスを404に変更できない?
コマンドプロンプトでPumaでサーバー接続中に Curl を使って問い合わせる方法というのがよく分かりません。。なのでステータスを 404 に指定した際の確認ができていません。それとも停止してから実行?
リクエストが成功するとログには「200 ok」と表示されてしまいます。
とりあえずコントローラに記述するアクションを「head 404」や「head :not_found」にすれば、htmlが用意されていたとしても Not found のページを表示できることは確認しました。
レイアウトを使用できない?
テキストを直にブラウザに表示する際に、下記のように記述することでレイアウトを使用できるということですがうまくいきません。エラー内容は「デフォルトレイアウトが無いよ」みたいな感じですが、軽くググってみても分からず。。
render plain: "Hello!", layout: true
とりあえず学習を進めていくうちにレイアウトについても分かると思うので進めます。
JSON/XML形式での出力について
まず、下記のようにJSON形式での出力を試してエラーも無くアクセスできたのでうまくいってそう? 例によってCurlを使った確認方法が分からないので、とりあえず進めます。
personal = {'name' => 'yamada', 'old' => 28}
render json: personal
お次に、下記のようにXML形式での出力を試したところ、入門サイトと同様の結果になったのでこちらもうまくいってる感じでしょうか。
personal = {'name' => 'yamada', 'old' => 28}
render xml: personal
リダイレクトについて
まず「src1」の記述はこちらでうまくいきます。
redirect_to action: 'dest'
しかし「src2」は実行そのもののエラーは出ませんが、ブラウザ上のページには「このページは動作していません localhost から無効な応答が送信されました」と表示されます。
自分自身のパスを含めることができない感じでしょうか?
redirect_to 'plans/dest'
パラメータの取得について
うーん。記事を参考にパラメータ取得を試みるもうまくいきません。
徐々にうまくいかないケースが増えてきました。。
●routes.rb の中身
get 'travels/show' => 'travels#show'●travels_controller の中身
def show
render plain: "upper = #{params[:upper]}" + ", lower = #{params[:lower]}"
end
しかしその後のクエリでのパラメータ取得はうまくいきました。
POSTを使って送信されたパラメータの取得について
こちらは post.html の表示はうまくいきますが(この時、アクセスするURLは「http://localhost:3000/post.html」なのでご注意)、送信ボタンを押してページを移動すると下記のようなエラーが表示されます。「無効な認証トークン」だと注意されます。
ActionController::InvalidAuthenticityToken in TravelsController#show
とりあえずコントローラに「protect_from_forgery」と一行追加すれば正常に動作しました。
class TravelsController < ApplicationController
protect_from_forgery
def show
render plain: "旅行先 = #{params[:dest]}, 人数 = #{params[:num]}"
end
end
こちらの記事を参考にさせていただきました。
パラメータでハッシュを渡したり配列を渡す手順も無事に記事の通りに動作しました。
とりあえず今回はここまで!
続きはこちら。
Rubyを始めてみた5:ルーティング・データベース・テンプレート - ゲームエフェクトデザイナーのブログ (新)