Railsのモデル作成時にカラム指定をしてみた!
はじめに
お問い合わせフォームの時には特に考えてやっていなかったのですが、テーブル構築時に普通ならnot nullやデフォルト値の設定などすると思います。
今回はそんな設定をしてテーブル作成をしてみました。
手順
以前にもやったと思いますが、今後は"scaffold"を使用して一通り作成します。
scaffoldとmodelの違いがイマイチ分かりません...
>bundler exec rails g scaffold mogu code:string name:string zip:integer address:string telephone:integer
作成されたマイグレーションファイルを編集
お馴染みのマイグレーションファイルが生成されると思います。
先ほどのコマンドで"db/migrate/yyyymmddxxxxxx_create_mogus.rb"というファイルができます。
今回は下記の仕様でテーブルを作成したいと思います。
- idカラムは使わない
- idの代わりにcodeカラムをプライマリキー指定
- codeの文字列は32文字がMax
- zipカラムは20文字まで
- addressカラムはデフォルト"Tokyo"
- code, name, addressはnull不可
書き出すとこんな感じです。
class CreateMogus < ActiveRecord::Migration
def change
create_table(:mogus, :id=>false, :primary_key=>"code") do |t|
t.string :code, null: false, limit:32
t.string :name, null: false
t.integer :zip, limit: 7
t.string :address, null: false, default: 'Tokyo'
t.integer :telephone
t.timestamps null: false
end
end
end
テーブル作成
>bundler exec rake db:migrate RAILS_ENV=development_root
※RAILS_ENV=development_rootは個人的に設定している値です。
確認
+------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+-------+ | code | varchar(32) | NO | | NULL | | | name | varchar(255) | NO | | NULL | | | zip | bigint(20) | YES | | NULL | | | address | varchar(255) | NO | | Tokyo | | | telephone | int(11) | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +------------+--------------+------+-----+---------+-------+
個人的感想ですが、毎回テーブル作成する度にidカラムがデフォルトで用意されるのは気持ち悪いです。(古い人の考えだからかも知れませんが...)
この辺って文化的にどうなんでしょうか。
もし、優しくてRails=自分だという方は是非教えてください。
以上、最後まで読んでいただきありがとうございます。
【便利】いいツールありました。(anyenv)
Reactの記事を読んでいたらNode.jsのインストールの話になり、『ndenvとはあるのかな?』と検索していたら、もっと便利な『anyenv』を見つけました。
『*env』と付くものをインストールしようとすると大抵これで済みそうです。
便利です。ありがたいですね。
感想
最近、開発周りの環境が充実していて独自の機能実装をしない限りバックエンドだけに限って言えばコーディングする量が十数年前に比べて、だいぶ減っているかと思います。
寧ろフロントエンド、ミドルウェアエンジニア、DBエンジニアの方が大変かと思います。
もちろん、バックエンドエンジニアも暇と言う訳では無いです!色んな所に駆り出される人が多いでしょうから...
Ruby on Railsのお勉強 〜お問い合わせフォーム編(save) その7〜
はじめに
前回の作業でバリデーション(検証)が完了したので最後のデータ登録を試して見たいと思います。
↓バリデーションはこちら を参照ください。
やる事
...特に無し?
今回はただ単純に登録するだけなので特に難しい事はありません。
手順
thanksページまで遷移した前提で話を進めます。
因みにthanksページはこのように記述します。
class InquiryController < ApplicationController
... 中略 ...
def thanks
@inquiry = Inquiry.new(post_params)
if @inquiry.save == false
render template: 'inquiry/index'
end
end
... 中略 ...
end
たったこれだけでした。
save実行時にバリデーションが実行されるので、わざわざやる必要が無いそうです。
因みに、モデルに値を渡して初期化されるか確認するには、railsのコンソールで下記のようにコマンドできます。
>bundler exec rails console --sandbox
>inquiry = Inquiry.new(name: 'hoge_name', mail: 'hoge_mail@gmail.com', telephone: '12345')
=> #<Inquiry id: nil, name: "hoge_name", mail: "hoge_mail@gmail.com", telephone: "12345", created_at: nil, updated_at: nil>
だいぶ呆気ないのですが簡単なお問い合わせフォームで感覚を掴んでみる程度だと、こんなもんで登録できてしまいます。
課題
モデル
- 書き方(ビジネスロジックとの住み分け)
- 初期化(attr_accessorが不要な理由)
- 親子関係のテーブルの扱いかた
バリデーション
- 自作
- 組み合わせ
- テーブルの親子関係
その他
- 例外処理
- ロールバックの動き
- テーブル構築時の指定(not nullなど)
- データの流し込み作業
ざっと考えただけでもこれくらいある。
とりあえず、1つずつ吸収していくしかないですね。
お問い合わせフォームに関してはこれで完結とさせていただきます。
今後は疑問に思った事を中心に作業してみたいと思います。
以上、最後まで読んでいただきありがとうございます。
Ruby on Railsのお勉強 〜お問い合わせフォーム編(Validation) その6〜
はじめに
漸くバリデーションに入ります。
フレームワークを使用する上で避けては通る事のできない道です。
ドキュメントを読んでみたのですが、端折っている箇所があって理解に時間が掛かるので、今回は初歩的な使い方に注力します。
↓こちら参考にしたドキュメントになります。
Active Record バリデーション | Rails ガイド
今回やる事
- モデルにバリデーションを指定
- 確認画面(inquiry/confirm)でバリデーションを実行
- エラーメッセージの表示
- エラーメッセージの日本語化
モデルにバリデーションを指定
class Inquiry < ActiveRecord::Base
# Validation
# name ... 2文字以上〜30文字以下
# mali ... 未入力不可、255文字以下
# mail_confirmation ... mailの入力確認
# telephone ... 数字のみ
validates :name, length: { in: 2..30 }
validates :mail, confirmation: true, length: {maximum: 255}
validates :mail_confirmation, presence: true
validates :telephone, format: { with: /\A[0-9]+\z/ }
def init(inq_params)
@name = inq_params[:name]
@mail = inq_params[:mail]
@mail_confirmation = inq_params[:mail_confirmation]
@telephone = inq_params[:telephone]
end
end
確認画面(inquiry/confirm)でバリデーションを実行
class InquiryController < ApplicationController
def index
@inquiry = Inquiry.new(post_params)
end
def confirm
@inquiry = Inquiry.new(post_params)
if @inquiry.valid? == false
logger.debug @inquiry.errors.messages
render template: 'inquiry/index'
end
end
def thanks
end
private
def post_params
if params.has_key?(:inquiry)
params.require(:inquiry).permit(
:name,
:mail,
:mail_confirmation,
:telephone
)
else
{}
end
end
end
エラーメッセージの表示
<h1>お問い合わせ入力フォーム(Inquiry#index)</h1>
<p>Find me in app/views/inquiry/index.html.erb</p>
<div>
<!--
例外発生時
-->
<% if @inquiry.errors.any? %>
<div id="error_explanation">
<h2>入力項目を確認してください。</h2>
<ul>
<% @inquiry.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
... 中略 ...
</div>
エラーメッセージの日本語化
日本語化の手順はこちらを参考にして設定しております。ありがとうございます。
感想と課題
バリデーション自体の組み込み作業は難しくないと思います。
ただ、様々な状況を想定して使えるようになっているので全ての使用を把握するのが大変だと思います。
あと、エラーメッセージの差し替え方法と自作バリデーションはいつの日か必ず要求される事になるので予習しておきたい課題です。
ざっとですがバリデーションはこの辺にして、次回はいよいよDB書き込みに行きたいと思います。
以上、最後まで読んでいただきありがとうございます。
gitとGitHub連携の設定について
はじめに
gitの初期設定を行ったのでGitHubとの連携も設定してみたいと思います。
下記の準備が必要ですが、こちらは既にあるものとして話を進めます。
手順
公開鍵をGitHubへ登録
- 右上の"+"からSettingを選択
- 開いた画面の左メニューから"SSH and GPG keys"を選択
- SSH keysの"New SSH key" ボタンを押下
- "title"、"Key"に公開鍵の情報を入力して"Add SSH key"を押下(注)
注:"title"にどの公開鍵か判別できるようにしましょう。
ローカル環境の設定
GitHubに公開鍵が登録できたらローカル環境(自身のホームディレクトリ)にてsshの設定を追加します。
設定ファイルの追加
>cd ~/
>vi ~/.ssh/config
Host github github.com HostName github.com IdentityFile ~/.ssh/{秘密鍵のファイル名} User git
>chmod 0600 ~/.ssh/config
疎通の確認
下記が表示されればGitHubと鍵認証でやり取りできています。
"Hi {ユーザー名}! You've successfully authenticated, but GitHub does not provide shell access."
ローカルに作成中のソースをリポジトリへ登録
GitHub側でやる事
ローカル環境でやる事
Railsの話になってしまいますが、/log、/tmp、/vendorは管理する必要が無いので.gitignoreに登録しておきます。
>git init
>git commit -m "first commit"
>git remote add origin git@github.com:{ユーザー名}/{リポジトリ名}.git # ssh_key設定ありの場合
>git remote add origin https://github.com/{ユーザー名}/{リポジトリ名}.git # ssh_key設定なし
>git push -u origin master
これで開発中のファイルをGitHubで管理できます。
以上、最後まで読んでいただきありがとうございます。
gitの設定を忘れてた...
はじめに
『やろう、やろう』と思っていて忘れていました。
今までの作業も個人でやっているだけなので特に管理する意識もありませんでした...
良くないと思いGitの設定をやる事にしました。
開発環境構築後に毎回やる事なので書いておきます。
開発環境
OS: CentOS7
git: 1.8.3.1
初期設定
とりあえず、初期設定は下記ぐらいしかいつもやっておりません。
詳しい内容はGit - Git の設定で確認できます。
git config --global user.name "ユーザー名" git config --global user.email "メールアドレス" git config --global core.editor vim # commit時に使用するエディタの指定 git config --global color.ui true # 色付け git config --global core.autocrlf input # 改行コード対策(CRLFとかLFとか)
エイリアス
頻繁に使用するコマンドはエイリアスを設定しておきます。
詳しい内容はGit - Git エイリアスで確認できます。
git config --global alias.st status git config --global alias.cl clone git config --global alias.br branch git config --global alias.co checkout git config --global alias.ci commit
以上、読んでいただきありがとうございます。
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書き込みは次回に持ち越します。
ボリューム感少ないですが一気に躓くところとやる事が増えた感じです。(まとめてみるとそうでもないのですが...)
以上、最後まで読んでいただきありがとうございます。