Ruby on Railsのお勉強 〜お問い合わせフォーム編(Controller) その5〜
はじめに
前回はControllerの環境構築まで行いました。
今回は実際にお問い合わせフォーム(入力)を作成してみたいと思います。
作業するその前に...
躓いた点をまとめておきます。参考になれば幸いです。
セキュリティについて
CSRF対策について理解しておきましょう。
Railsはこの対策がデフォルトで有効になっているので、POST送信時にCSRF対策で発行された認証トークンを渡さないとエラーになります。
ファイル編集順について
色々試して思ったのがModel→Controller→Viewの順で編集した方が良いかと思います。
※開発する規模や内容によって変わってくるかも知れないので、あくまで個人的な感想です。
モデルについて
コントローラークラスからモデルを初期化するため、モデルにinitializeメソッドを用意したのですが、初期化時にエラーが発生してしまいます。
親クラス(ActiveRecord::Base)を継承しているので、そちらの初期化が無いからエラーになったのかと思い、superを付加したのですが、それでもダメでした。
しょうがないので、モデルにinitメソッドを用意し初期化後に呼び出してプロパティ変数を初期化するように対応しております。
こちらは私の勉強不足なので、対応を知っておられる方がいましたらご教授お願いします。
お問い合わせ入力フォーム作成
先ずは入力フォームの作成から始めたいと思います。
下記のように編集します。
file: app/controllers/inquiry_controller.rb
class InquiryController < ApplicationController
def index
@inquiry = Inquiry.new
@inquiry.init(params.has_key?(:inquiry) ? params[:inquiry] : {})
end
def confirm
end
def thanks
end
end
file: app/models/inquiry.rb
class Inquiry < ActiveRecord::Base
attr_accessor :name, :mail, :telephone
def init(inq_params)
@name = inq_params[:name]
@mail = inq_params[:mail]
@telephone = inq_params[:telephone]
end
end
file: app/views/inquiry/index.html.erb
※試しに3パターン書いてみました。
<h1>お問い合わせ入力フォーム(Inquiry#index)</h1>
<p>Find me in app/views/inquiry/index.html.erb</p>
<div>
<!--
form_for使用時
CSRF対策トークンを自動設定してくれる。
モデルにカラム名のプロパティ変数を用意する必要があります。
-->
<%= form_for @inquiry, :url => {:action => 'confirm'} do |f| %>
名前: <%= f.text_field :name %><br />
メール: <%= f.email_field :mail %><br />
電話: <%= f.telephone_field :telephone %><br />
<%= f.submit "確認" %>
<% end %>
<!--
form_tag使用時
CSRF対策トークンを自動設定してくれる。
-->
<%= form_tag('/inquiry/confirm') do %>
名前: <input type="text" name="inquiry[name]" value="<%= @inquiry.name %>" /><br />
メール: <input type="email" name="inquiry[mail]" value="<%= @inquiry.mail %>" /><br />
電話: <input type="tel" name="inquiry[telephone]" value="<%= @inquiry.telephone %>" /><br />
<input type="submit" name="cofirm_btn" value="確認" />
<% end %>
<!--
直書き
CSRF対策トークンを手動で設定する必要がある。
-->
<form action="/inquiry/confirm" method="post">
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
名前: <input type="text" name="inquiry[name]" value="<%= @inquiry.name %>" /><br />
メール: <input type="email" name="inquiry[mail]" value="<%= @inquiry.mail %>" /><br />
電話: <input type="tel" name="inquiry[telephone]" value="<%= @inquiry.telephone %>" /><br />
<input type="submit" name="cofirm_btn" value="確認" />
</div>
</form>
</div>
とりあえず、ここまで出来れば入力フォームを表示できて確認画面へ遷移できます。
バリデーションとDB書き込みは次回に持ち越します。
ボリューム感少ないですが一気に躓くところとやる事が増えた感じです。(まとめてみるとそうでもないのですが...)
以上、最後まで読んでいただきありがとうございます。
Ruby on Railsのお勉強 〜お問い合わせフォーム編(Controller) その4〜
はじめに
前回の作業でテーブルとモデルの準備ができたので、今回はフロントまわりのコントローラーをやってみたいと思います。
コントローラーについては入力(index)、確認(confirm)、送信(thanks)ページ構成を考えております。
この過程でパラメータの受け渡しや、テーブルへの書き込みなどを学んでいきたいと思うのですが、全部やると長いため、今回はコントローラーのgenerateとルーティング(config/routes.rb)に絞ります。
↓テーブル、モデルの準備はこちらの記事で確認できます。
コントローラー準備
index、confirm、thanksの作成
"rails generate"で作成していきます。
コマンドは下記の通りです。
>bundler exec rails g controller inquiry index confirm thanks
これを実行すると関連するファイルが作成されます。
色々と作成されるのですが、今回は実際のアクションに関わるファイルだけ取り上げます。
ルーター(作成というより更新)
リクエストされた"お問い合わせのURL"を、どのコントローラーのアクションに誘導するのか指定する設定ファイルです。
config/routes.rb
コントローラーをgenerateしたばかりの時は単純なルーティングしか用意されません。
変更前
Rails.application.routes.draw do
get 'inquiry/index'
get 'inquiry/confirm'
get 'inquiry/thanks'
しかし、お問い合わせページ遷移時のURLに"index有り無し対応"、入力時に戻るなども発生するので"indexアクションはGET、POSTを受け付けられる"ようにしたいといった要望が出てくると思うので、下記のように書き換えます。
変更後
Rails.application.routes.draw do
match 'inquiry' ,to: 'inquiry#index', via: [:get, :post]
match 'inquiry/index' ,to: 'inquiry#index', via: [:get, :post]
post 'inquiry/confirm'
post 'inquiry/thanks'
ルーティングについては↓こちらに詳しい説明があります。
ですが、入門で読むにはちょっと難しいかも...ルーティングを実装している何かしらのフレームワークを体験していれば、ある程度は見当がつくのですがRailsのルーティングはやれる事が多すぎて戸惑います。
とりあえず、設定したら下記のコマンドで意図した動きになるか確認が必要です。
>bundler exec rake routes
結果
Prefix Verb URI Pattern Controller#Action
inquiry GET|POST /inquiry(.:format) inquiry#index
inquiry_index GET|POST /inquiry/index(.:format) inquiry#index
inquiry_confirm POST /inquiry/confirm(.:format) inquiry#confirm
inquiry_thanks POST /inquiry/thanks(.:format) inquiry#thanks
コントローラークラス
このクラスの中にindex、confirm、thanksアクションメソッドが存在します。
app/controllers/inquiry_controller.rb
出力テンプレートファイル
受けたリクエストをレスポンス(HTML形式で)するためのテンプレートファイルです。
app/views/inquiry/index.html.erb
app/views/inquiry/confirm.html.erb
app/views/inquiry/thanks.html.erb
これでコントローラーの準備は整いました。
次は実際にHTMLを組んでDBへ書き込みまで出来れば良いかな?っといった感じです。
以上、最後まで読んでいただきありがとうございます。
Ruby on Railsのお勉強 〜お問い合わせフォーム編 その3〜
はじめに
前回はrakeコマンドを使用してDBを作成するところまでやりました。
今回は作成したDBにテーブルとプロジェクトにモデルを作成してみたいと思います。
テーブル構成はその1で書いてある構成を考えております。
モデル&テーブル作成
↓またまた、こちらのドキュメントからコマンドの使用方法を確認しました。
railsコマンド(rails) - - Railsドキュメント
大雑把に流れを説明すると
- "rails generate model ..."でモデルクラスとMigrationスクリプト(※)を作成
- "rake db:migrate ..."でテーブルを作成
※Migrationスクリプトという名称で正解か自信がありません。間違っていたらゴメンなさい。
モデル作成
generaterを使用してモデルの作成をします。
カラムを指定しないでmigrationスクリプトだけ作成して、後でスクリプトを手動で編集しても良いかも知れません。
>bundler exec rails generate model inquiry name:string mail:string telephone:string
上記のコマンドでモデルを作成すると同時に"db/migrate"以下にMigrationスクリプトが生成されます。
その中身が↓になります。
class CreateInquiries < ActiveRecord::Migration
def change
create_table :inquiries do |t|
t.string :name
t.string :mail
t.string :telephone
t.timestamps null: false
end
end
end
テーブル作成
Maigrationスクリプトが生成できたら、今度はテーブルの作成です。
先日、DBを作成した時のように権限の強い定義を指定して作成します。
>bundler exec rake db:migrate RAILS_ENV=development_root
問題無ければ下記のようなテーブルが作成されます。
+------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | mail | varchar(255) | YES | | NULL | | | telephone | varchar(255) | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +------------+--------------+------+-----+---------+----------------+
後は、modelクラスを整える作業だと思うのですが、この段階だと説明できる事が無いので、コントローラーの組み込みと合わせてモデルクラスを編集していく事にしたいと思います。(Validationとかモデルに含む事になると思うので)
一旦、モデルから離れて次回はコントローラーに入りたいと思います。
以上、最後まで読んでいただきありがとうございます。
Ruby on Railsのお勉強 〜お問い合わせフォーム編 その2〜
先日のトホホな問題を解決できたので、本日はDB辺りを攻めてみたいと思います。
↓トホホな話はこちら
MariaDBをインストールした時に開発環境用のDBを作成したのですが、色々と調べていくうちにrakeコマンドでデータベースを作成できる事が判明したので、その辺の手順をアップしていきたいと思います。
↓この辺に使い方がありました。
データベースを作成するまで
設定ファイルを編集
初期状態だとsqlite3の設定になっていると思うので自分の環境に合わせて書き換えます。(今回は開発環境だけ)
>vi config/database.yml
# MariaDB version 0.4.8
# gem install mysql2
#
# Ensure the mysql2 gem is defined in your Gemfile
# gem 'mysql2'
#
default: &default
adapter: mysql2
encoding: utf8
pool: 5
timeout: 5000
development_root:
<<: *default
database: # 開発DB名
username: root
password: # rootのパスワード
host: localhost
development:
<<: *default
database: # 開発DB名
username: # 開発ユーザー名
password: # 開発ユーザーのパスワード
host: localhost
development_root、developmentと用意しております。
理由はrakeコマンドでデーターベースを作成するなど強い権限をもったユーザーと使い分けするためです。
- development_root → 開発DBを操作するため
- development → 通常使用
データベースを作成
環境(RAILS_ENV)を指定してデータベースを作成
>bundler exec rake db:create RAILS_ENV=development_root
データベースが作成されたか確認
>mysql -uroot -p -e "show databases"
※database.ymlのdevelopment_rootにて指定したdatabaseの名前でデータベースが作成されていれば成功です。
今日はここまで
準備ばかりでなかなか先に進まない...
次回はテーブル作成してみたいと思います。
Ruby on Railsのお勉強 〜お問い合わせフォーム編 その1〜
はじめに
お問い合わせフォームを作成する事で、Railsの取り扱い方を勉強してみたいと思います。
主に下記の機能を試してみたいと思います。
- Generaterの使い方
- Routesの使い方
- GET/POSTパラメータの受け取り方
- DB接続(development / staging / production)
他にもSESSION、キャッシュサーバーなど必要かと思いますが、この辺は後日に調べます。
前回の作業でプロジェクトまで作成しているので、そのプロジェクト内で作業を進めます。
テーブル構成
とりあえず、テーブル構造は下記を考えています。
※手探りなので命名規則がRailsのお作法に沿ってないかも...その場合は随時直していきます。
Table
inquiry
Columns
id integer
name verchar(255)
mail verchar(255)
telephone verchar(255)
created_at datetime
updated_at datetime
id、created、updatedは自動でできるらしいです。
環境構築
先日、MariaDBをインストールしたので、RailsでDB接続するための環境構築します。
パッケージの追加
MariaDBへ接続するためのパッケージをインストールします。
どうやらmysql2というパッケージがMariaDB接続に必要みたいです。
で、mysql2をインストールする前に下記のyumパッケージをインストールしないとエラーになる。
>yum install MariaDB-devel MariaDB-shared
ここでハマった...
疲れたので実際にテーブル作成するのは後日にします。トホホです。
CentOS7へのMariaDBインストールについて
Ruby on Railsの勉強中ですが、ここでDB接続の準備のためMariaDBをインストールしてみたいと思います。
MariaDBを選択した理由は"使ってみたかった"だけです。
MariaDBのHPにインストール方法が詳しく記述されております。(ありがたや)
さっそくインストール
と言っても、単にMariaDBの手順に沿ってやるだけです。
リポジトリの追加とyum install、後は初期化をゴニョゴニョするだけ。
リポジトリの追加
下記のリポジトリ作成ページで自動生成した設定情報を貼り付けるだけ。
MariaDB - Setting up MariaDB Repositories - MariaDB
>vi /etc/yum.repos.d/MariaDB.repo
インストール
>yum install MariaDB-server MariaDB-client
面倒な人はオプションの"-y"を付けて実行すれば楽チンです。
MariaDBのシステム設定&起動
>systemctl enable mariadb.service
>systemctl start mariadb.service
MariaDB初期化
公式HPにある手順で初期化してみます。
>mysql_secure_installation
色々聞かれてくるけど、やった事はrootのパスワード設定と各質問に"y"を押すだけ。
DBとユーザー作成
MariaDBに接続してデータベース、ユーザーを作成する。
※クローズな開発環境なのでテキトーです。
DB名:rbhoge
ユーザー名:rbhoge
DB作成
>create database rbhoge;
ユーザー作成
>create user rbhoge@'localhost' identified by '{password}';
権限付与
>grant all on rbhoge.* to rbhoge@'localhost';
以上でDBの準備は終了です。
Ruby on Railsのお勉強に戻ります!
Ruby on Railsのお勉強 〜おさらい〜
Railsをやろうと思った経緯
ここ数年でRailsの要望が今まで以上に、すごいスピードで上がってきている事を実感したので、使えるようになろうかと重い腰をあげました。
正直、バックエンドのFWはパフォーマンスと運用コストが見合っていれば『なんでもいいじゃない?』っていうのが私の意見なのですが...
環境構築のおさらい
以前、環境構築でrbenvとbundlerのインストールの記事を書いております。
今回は用語と工程のおさらいに止めます。
環境構築を確認されたい方は↓の記事を確認お願いします。
用語
先ずは各用語について、おさらいです。(簡単な説明のみ)
rbenv
複数のRubyバージョンを管理する。
gem
rubyのパッケージを管理する。
bundler
gemの一部でパッケージを一括管理できる。
Ruby on Rails開発環境を作るまでの工程
- rbenvのインストール(この時点で同時にgemはインストールされる)
- 使用するrubyのバージョンを指定してインストール
- bundlerのインストール
- 開発するための場所(ディレクトリ)を作成して移動
- 移動先のディレクトリ内でbundlerの初期化(Gemfile作成)を行う
- 作成されたGemfileに使用するrailsのバージョンを記述してrailsをインストール
- railsコマンドでプロジェクトを作成(ここでほぼ環境構築おわり)
実際の組み込み作業
構成
プロジェクト : rbhoge
手順
>mkdir rbhoge
>cd rbhoge
>rbenv local 2.4.1
>bundler init
>vi Gemfile
gem "rails", "{version}" を追記
>bundler install --path vendor/bundler
>bundler exec rails new .
>vi Gemfile
"therubyracer"のコメントアウトを外す
>bundler install --path vendor/bundler
とりあえず、ここまで
次回からは簡単なお問い合わせフォームを作ってみたいと思います。