【Rails】Railsアプリケーション作成

railsアプリケーションを作る

rails new testapp

 

railsアプリケーションを起動

rails server

 

モデルを作る (単数系で頭を大文字 e.g. Project )

rails generage model Project title:string

 

データベースに反映

rake db:migrate

 

データベースの確認

rails db
sqlite > .shema

sqlite> select * from projects;

 

rubyコンソール
rails console
>p=new Project(title:”p1″)
>p.save()

>Project.create(title:”p2″)

>Project.all

>exit

 

コントローラーを作る

rails g controller Projects        ※モデルは複数形で指定する事

      create  app/controllers/projects_controller.rb

      create    app/views/projects

 

ルーティング設定をする
config/routes.rbにmodelを追記

Rails.application.routes.draw do

resources :projects

 

ルーティングを反映する
→ new/delete等のURLが作成される。

rake routes

Prefix Verb URI Pattern Controller#Action
projects GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project GET /projects/new(.:format) projects#new
edit_project GET /projects/:id/edit(.:format) projects#edit
project GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#destroy

 

 

モデルのデータ一覧
インデックスアクションを作る

  • コントローラーに下記の関数を追加

def index
@projects = Project.all
end

  • viewを追加(index.html.erb)

<h3>Projects</h3>
<ul>
<% @projects.each do |prj| %>
<li><%= prj.title %></li>
<% end%>
</ul>

 

 URLルートを設定する

config/routes.rbに追記する。

root ‘projects#index’

 

Viewの共通テンプレート

このファイルを変更する
app/views/layout/application.html.erb

<%= yield %> ユーザーのviewがここに展開される

 

  • イメージタグをつける

assets/image/xxx.png

<%= image_tag “xxx.png” %>

 

  • スタイルシートの共通設定を変更する

assets/stylesheets/application.css

<%= link_to “home”, “/” %>
<%= link_to “home”, projects_path %>
<%= link_to “new”, new_project_path %>

このprojects_pathは、「rake routes」のPrefixのところに「_path」をつけたもの

Prefix Verb URI Pattern Controller#Action
projects GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project GET /projects/new(.:format) projects#new
edit_project GET /projects/:id/edit(.:format) projects#edit
project GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#destroy

 

詳細表示画面を追加する 

コントローラーにアクションを追加する。

rake routesのときにログからurl取得

 

Prefix Verb URI Pattern Controller#Action
projects GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project GET /projects/new(.:format) projects#new
edit_project GET /projects/:id/edit(.:format) projects#edit
project GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#destroy

 

class ProjectsController < ApplicationController

def index
@projects = Project.all
end

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

 

 対応するViewを作成「show.html.erb」

<h3><%= @project.title %></h3>

 

送信フォームを作る

html

<li><%=link_to “add new”, new_project_path %></li>

controller

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

 

view

<%= form_for @project do |f| %>
<p>
<%= f.label :title %>
<%= f.text_field :title %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>

 

 

フォームの入力制限を行う。

model

class Project < ActiveRecord::Base

validates :title, presence: true
end

 

フォームの入力制限を行う。エラーメッセージ付き

validates :title, 

presence: { message: “入力してください” },
length: {minimum: 3, message: “短いです” }

 

presence: trueは、必須項目にするの意

def create
@project = Project.new(project_params)
if @project.save
redirect_to projects_path   ←セーブ成功
else

render ‘new’        ←セーブ失敗
end

 

view 

<%= form_for @project do |f| %>
<p>
<%= f.label :title %>
<%= f.text_field :title %>
<% if @project.errors.any? %>
#<%= @project.errors.inspect %>     エラー表示
<% end %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>

 

フォームの共通化(パーシャル)

new.html.erb / edit.html.erb 

<%= render ‘form’ %>

 

view

_form.html .erbを作成し、共通フォームを作成

先頭に_をつけるルール

 

actionが呼ばれた時のコールバック設定

actionが呼ばれたときにset_projectメソッドを呼び出す例。show,edit,update,destroyに適用。

before_action :set_project, only: [:show, :edit,:update,:destroy]

 

モデルを作る

rails g model Task title:string done:boolean project:references

 rake db:migrate

 rails g controller Tasks

モデルを1:nにする

class Project < ActiveRecord::Base
has_many :tasks 

 

ルーティングの作成(routes.rb)
resources :projects do

resources :tasks, only:[:create, :destroy]
end
ルーティングの確認
rake routes

Prefix Verb URI Pattern Controller#Action
project_tasks POST /projects/:project_id/tasks(.:format) tasks#create
project_task DELETE /projects/:project_id/tasks/:id(.:format) tasks#destroy
projects GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project GET /projects/new(.:format) projects#new
edit_project GET /projects/:id/edit(.:format) projects#edit
project GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#destroy
root GET / projects#index
コントローラーの実装
task.rb

 

チェックボックスを作る

html

<%= check_box_tag ”,”, t.done,{‘data-id’ => t.id, ‘data-project_id’ => t.project_id } %>

下記のコードになる。

<input data-id=”16″ data-project_id=”4″ id=”” name=”” type=”checkbox” value=”” />

 

jQueryでPOST

<script>
$(function(){
$(“input[type=checkbox]”).click(function(){
$.post(‘/projects/’+$(this).data(‘project_id’)+’/tasks/’+$(this).data(‘id’)+’/toggle’)
});
});
</script>
routeの設定(jQueryのPOSTされたURLをtasksのtoggleにルーティング)
post ‘/projects/:project_id/tasks/:id/toggle’ => ‘tasks#toggle’

 

controller

def toggle
 render nothing: true    #テンプレートを返さない
@task = Task.find(params[:id])
@task.done = !@task.done
@task.save
end

 

Leave a Reply