Rubyを始めてみた3:MVCの一連の流れ
前回に引き続き、こちらの Rails入門 の記事を進めていきました。
RailsにおけるMVC(モデル / ビュー / コントローラ)の作成に入っていきます。
ただ、初めての概念ばかりで何をしているのか把握しづらかったので図を作りました。
まず最初にコントローラで直にhtmlを書き換えていますが、このようなイメージかなと。
次のステップでテンプレートと変数を使ってhtmlを書き換えていますが、こんな感じかなと。
さらにデータベースを制御するステップはこんな感じ?(間違ってるかも)
これで何をしているか把握しやすくなった気がします。
使用しているエディタ
最初は秀丸を使っていましたがツリー表示が無いと不便だったのでATOMに変更。
起こったエラーなど
まずはコントローラのアクションメソッドでテキストを「render」で直に出力する解説をされていますが、後の起動時にうまく動作しませんでした。
下記のように変えたらいけたらのですが、Railsのバージョンによるものでしょうか。。
def hello render plain: 'Hello!' end
def bye render plain: 'bye!' end
ちなみにこの「plain」については、こちらの記事を参考にさせていただきました。
そして、実際にアプリケーションを起動すると下記のようなエラーが起きました。
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/actionpack-5.2.3/lib/action_dispatch/routing/mapper.rb:81:in `check_via': You should not use the `match` method in your router without specifying an HTTP method.
(ArgumentError)
If you want to expose your action to both GET and POST, add `via: [:get, :post]` option.
If you want to expose your action to GET, use `get` in the router:
Instead of: match "controller#action"
Do: get "controller#action"
「matchを使わずgetを使え」という感じの内容になっています。
こちらに関しては「teratail」でドンピシャで質問されている方がいらっしゃいました。
Ruby - Ruby on Railsでルーティングのエラー|teratail
つまるところ下記のように記述すれば良いようです。
get 'hello' => 'booklist#hello'
get 'bye' => 'booklist#bye'
これで無事うまくいきました。ありがたや。。
もしも match をそのまま使う場合はオプション指定が必要だそうで‥
match 'hello' => 'booklist#hello', via: :get
match 'bye' => 'booklist#bye', via: :get
こちらでいけました。
「via: :オプション(今回の場合は get )」を最後に付与すれば良いようです。
ちなみに「=>」は「, to:」でもいけるようで、前者の方が記述は楽ですが、ググると後者で解説されているケースが多いので知っておくと良いかと思いました。
ついでに、ルーティング周りで参考になりそうな記事もいくつかペタペタと。
文字コードについて
下記のテンプレートの作成の手順では文字コードについての解説があります。
ビューの作成とデータの受け渡し - Ruby on Rails入門
手元で試したところ、Rails用に作成するテキストファイルは基本的にUTF-8で保存しておけば、日本語を使用していても「# coding: utf-8」や「#! ruby -Ks」を記述しなくてもエラー無く正常に表示できました。
データベース制御のメモ
データベースの作成
rake db:create
モデルの作成
rails generate model モデル名
rake db:migrate
テーブルにデータを追加
rake db:seed
rails dbconsole 起動
.quit 終了
指定のテーブルからSQLの構文で全データを取得
select * from テーブル名
データベースの情報をHTMLに反映させる流れまでうまくいきました。
とりあえず今回はここまで!