Newアクション(新規作成)
新規作成の流れ
newアクションとそれに対応するviewにフォームを設置。フォームからの入力をPOSTでprojectsが受け取り、createアクションを実行するという流れ。
コントローラー(newアクション)
def new @project = Project.new end
フォームView(new.html.erb)
<h1>Add New</h1> <%= form_for @project do |f| %> <p> <%= f.label :title %><br> <%= f.text_field :title %> </p> <p> <%= f.submit %> </p> <% end %>
フォームの作成
form_forでフォームの開始と終了タグを生成できる。
ラベル作成
f.label
テキストフィールド作成
f.text_field
サブミットボタン
f.submit
データの保存
projectsにpostしてcreateアクションを起こす流れ。submitボタンを押した段階でpostされる...?
保存する仕組みとvalidation
createアクション
def create @project = Project.new(project_params) if @project.save redirect_to projects_path else render 'new' end end private def project_params params[:project].permit(:title) end end
フィルタリング
project_paramsというプライベートメソッドでフィルタリングをする。newアクションで渡ってきたprojectのtitleだけを許可するみたいな感じ。昔はこんなことしなかったみたいだけど、最近はセキュリティーを高めるために必要とのこと。お決まりの書き方。
Validation
フォームからなにも入力しなくても新しいモデルが作れてしまう。なので、適切な形でデータを保存できるようにvalidateというものをする。
project.rb(モデル)を編集
class Project < ActiveRecord::Base validates :title, presence: true end
対象はtitle、ルールはそれがあるかどうかを判定するpresenceを指定する。
@~.saveを実行した段階でvalidationが実行されるので、if文をsave部分に追加する。
そして、エラー入力があった場合は画面遷移させたくないので、falseだった場合にrenderでnewを指定することで、画面遷移せず同じ画面にとどまる。
エラーメッセージの表示(newのviewをいじる)
<% if @project.errors.any? %> <%= @project.errors.inspect %>
@project.errorsにエラーが格納されているので、if文でerrorがあるかどうか判定する。あった場合に、errosに格納されている内容をメッセージとして表示する。inspectはエラーメッセージをそのまま表示する。一旦、inspectでどんな内容か確かめ、必要な部分だけを抽出してあげるという流れ。
内容を見ると、titleがキーで、メッセージ配列の0番目にデフォルトメッセージが入っているので、これを表示してあげる。
<%= @project.errors.messages[:title][0] %>
メッセージを変える
model.rbでpresenceを設定したが、いくつでもルールを追加できるし、メッセージも自由に作ることができる。
validates :title, presence: {message: "入力してください"}, length: {minimum:3,message:"3文字以上!"}
新たにlengthという文字数指定を追加した。
因にmessage:""はシンボルをキーとして使う表記法みたい。ハッシュの書き方なのかなーrubyやってないからよく分からん。
とまあ、このな感じでフォーム作成→検証→保存の流れを作成した。