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でどんな内容か確かめ、必要な部分だけを抽出してあげるという流れ。f:id:nm777taka:20140311110926p:plain
内容を見ると、titleがキーで、メッセージ配列の0番目にデフォルトメッセージが入っているので、これを表示してあげる。

<%= @project.errors.messages[:title][0] %>
メッセージを変える

model.rbでpresenceを設定したが、いくつでもルールを追加できるし、メッセージも自由に作ることができる。

validates :title, 
	presence: {message: "入力してください"},
	length: {minimum:3,message:"3文字以上!"}

新たにlengthという文字数指定を追加した。
因にmessage:""はシンボルをキーとして使う表記法みたい。ハッシュの書き方なのかなーrubyやってないからよく分からん。

とまあ、このな感じでフォーム作成→検証→保存の流れを作成した。