いーほろよいの技術ブログ

IT技術ブログになります。

【便利】いいツールありました。(anyenv)

Reactの記事を読んでいたらNode.jsのインストールの話になり、『ndenvとはあるのかな?』と検索していたら、もっと便利な『anyenv』を見つけました。

github.com

 

『*env』と付くものをインストールしようとすると大抵これで済みそうです。

便利です。ありがたいですね。

 

感想

最近、開発周りの環境が充実していて独自の機能実装をしない限りバックエンドだけに限って言えばコーディングする量が十数年前に比べて、だいぶ減っているかと思います。

寧ろフロントエンド、ミドルウェアエンジニア、DBエンジニアの方が大変かと思います。

もちろん、バックエンドエンジニアも暇と言う訳では無いです!色んな所に駆り出される人が多いでしょうから...

 

 

Ruby on Railsのお勉強 〜お問い合わせフォーム編(save) その7〜

はじめに

前回の作業でバリデーション(検証)が完了したので最後のデータ登録を試して見たいと思います。

↓バリデーションはこちら を参照ください。

e-horoyoi.hatenablog.com

 

やる事

...特に無し?

今回はただ単純に登録するだけなので特に難しい事はありません。

 

手順

thanksページまで遷移した前提で話を進めます。

因みにthanksページはこのように記述します。

class InquiryController < ApplicationController
  ... 中略 ...

  def thanks
    @inquiry = Inquiry.new(post_params)
    if @inquiry.save == false
      render template: 'inquiry/index'
    end
  end

  ... 中略 ...
end

たったこれだけでした。

save実行時にバリデーションが実行されるので、わざわざやる必要が無いそうです。

railsguides.jp

 

因みに、モデルに値を渡して初期化されるか確認するには、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>

 

エラーメッセージの日本語化 

日本語化の手順はこちらを参考にして設定しております。ありがとうございます。

qiita.com

 

感想と課題

バリデーション自体の組み込み作業は難しくないと思います。

ただ、様々な状況を想定して使えるようになっているので全ての使用を把握するのが大変だと思います。

あと、エラーメッセージの差し替え方法と自作バリデーションはいつの日か必ず要求される事になるので予習しておきたい課題です。

 

ざっとですがバリデーションはこの辺にして、次回はいよいよDB書き込みに行きたいと思います。

 

以上、最後まで読んでいただきありがとうございます。

 

 

gitとGitHub連携の設定について

はじめに

gitの初期設定を行ったのでGitHubとの連携も設定してみたいと思います。

e-horoyoi.hatenablog.com

 下記の準備が必要ですが、こちらは既にあるものとして話を進めます。

 

手順

公開鍵をGitHubへ登録

  1. 右上の"+"からSettingを選択
  2. 開いた画面の左メニューから"SSH and GPG keys"を選択
  3. SSH keysの"New SSH key" ボタンを押下
  4. "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

 

疎通の確認

>ssh -T github

下記が表示されればGitHubと鍵認証でやり取りできています。

"Hi {ユーザー名}! You've successfully authenticated, but GitHub does not provide shell access."

 

ローカルに作成中のソースをリポジトリへ登録

GitHub側でやる事

GitHubにログインしてリポジトリを作成します。

f:id:e-horoyoi:20170727095922p:plain

 

 ローカル環境でやる事 

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の環境構築まで行いました。

e-horoyoi.hatenablog.com

 

今回は実際にお問い合わせフォーム(入力)を作成してみたいと思います。

 

作業するその前に...

躓いた点をまとめておきます。参考になれば幸いです。

 

セキュリティについて

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)に絞ります。

↓テーブル、モデルの準備はこちらの記事で確認できます。

e-horoyoi.hatenablog.com

 

コントローラー準備

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'

 

ルーティングについては↓こちらに詳しい説明があります。

railsguides.jp

ですが、入門で読むにはちょっと難しいかも...ルーティングを実装している何かしらのフレームワークを体験していれば、ある程度は見当がつくのですが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へ書き込みまで出来れば良いかな?っといった感じです。

 

以上、最後まで読んでいただきありがとうございます。