せいかつノート

読者です 読者をやめる 読者になる 読者になる

せいかつノート

日々の生活を少しだけ良くする

大学の先輩からRailsをやれと言われたから勉強してみる5

コンピュータ コンピュータ-Ruby on Rails

#11 Projectsの詳細を表示しよう | Ruby on Rails 4入門 - プログラミングならドットインストール

大学の同期がApple Developer Programに登録したそうです。何か面白いものを作ってくれるとワクワクしています。さて、第5弾です。わかりやすくかければいいのですが完全にメモ書きです。自分が後で思い出せればいいやという思想…
プロジェクトの詳細画面に遷移させます。ここは動画の通りやれば特に問題なかったので#12へ


f:id:kiyo468:20160223205820p:plain
新規のフォームを作っていきます。パスを調べます。

rake routes

f:id:kiyo468:20160223205958p:plain
projects#newとあるのでコントローラにnewという関数を作り、viewにnew.html.erbを作れば動くことがわかります。まずindexにリンクを作ります。

index.html.erb

<h1>Projects</h1>

<ul>
	<% @projects.each do |project| %>
	<li><%= link_to project.title, project_path(project.id) %></li>
	<% end %>
</ul>

<p><%= link_to "Add New" , new_project_path %></p>

次に、コントローラ
projects_controller.rb

class ProjectsController < ApplicationController

	def index
		@projects = Project.all
	end

	def show
		@project = Project.find(params[:id])
	end

	def new
		@project = Project.new
	end
end

最後にビュー

<h1><Add New></h1>

<%= form_for @project do |f| %>

<p>
	<%= f.label :title %><br>
	<%= f.text_field :title %>
</p>

<p>
	<%= f.submit %>
</p>
	
	<% end %>

ここまで書けば見た目のフォーム画面が完成。さらに登録できるようにコントローラに追記します。

projects_controller.rb

class ProjectsController < ApplicationController

	def index
		@projects = Project.all
	end

	def show
		@project = Project.find(params[:id])
	end

	def new
		@project = Project.new
	end

	def create
		@project = Project.new(project_params)
		@project.save
		redirect_to projects_path
	end

	private 

	def project_params
		params[:project].permit(:title)
	end

end

create関数を追記しました。さらにprivateでproject_paramsという関数も作っています。この辺からrubyを勉強していないからかスラスラ読めなくなってきた気がします。多分titleで渡ってきたパラメータのみをprojectのパラメータとして使うみたいなことをやっているんだと思います。(雑な理解)続けてモデルでバリデーションチェックをします。
models/project.rb

class Project < ActiveRecord::Base
	validates :title, presence: true
end

titleが空白のときのチェックです。続けてコントローラを修正します。

projects_controller.rb

class ProjectsController < ApplicationController

	def index
		@projects = Project.all
	end

	def show
		@project = Project.find(params[:id])
	end

	def new
		@project = Project.new
	end

	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

保存がOKであれば、リダイレクトでホームへ戻り、保存できなかった場合はnewつまりそのまま同じページを表示する。まだエラーメッセージはついていないのでつけていきます。

new.html.erb

<h1><Add New></h1>

<%= form_for @project do |f| %>

<p>
	<%= f.label :title %><br>
	<%= f.text_field :title %>
	<% @project.errors.any? %>
	<%= @project.errors.inspect %>
</p>

<p>
	<%= f.submit %>
</p>
	
	<% end %>

エラーが有った場合はerrorsにその値が入るそうなのでその値があった場合にはerrorsを表示すると設定する。ちょっとデバッグチックです。
f:id:kiyo468:20160223212013p:plain
エラーメッセージが取り出せそうな雰囲気があります。

<h1><Add New></h1>

<%= form_for @project do |f| %>

<p>
	<%= f.label :title %><br>
	<%= f.text_field :title %>
	<% if @project.errors.any? %>
	<%= @project.errors.messages[:title][0] %>
	<% end %>
</p>

<p>
	<%= f.submit %>
</p>
	
	<% end %>

なるほど配列で取れるんですね。とても納得。メッセージをオリジナルにしたい場合はmodelを編集すればいいそう。

class Project < ActiveRecord::Base
	validates :title, 
	presence: { message: "入力してください"},
	length: { minimum: 3, message: "3文字以上で入力してください"}

end

f:id:kiyo468:20160223212650p:plain

結構簡単にバリデーションは設定できました。updateはnewとやることがほとんど同じなので特に迷うことなく進めました。パーシャルの考え方もそんなに難しくないのでこの辺はさくさく。さらに削除を追加します。これもコードをみれば何やっているのかは分かるのでそのまま割愛。これで登録、編集、削除ができるようになりました。さらにコントローラにbefore_actionをつくることで繰り返しを減らすことができます。まだ今日は時間がありますがボリュームがあるので一旦ここで終わり