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

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

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書き込みは次回に持ち越します。

ボリューム感少ないですが一気に躓くところとやる事が増えた感じです。(まとめてみるとそうでもないのですが...)

 

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