【Rails】Association 1:nのモデル

rails g model project name:string
rails g model group name:string

rails g migration AddProjectIdToGroup project_id:integer

【model】に追記

class Group < ActiveRecord::Base
    belongs_to :project
end

 

rake db:migrate

 

【使い方】

p=Project.create(name: “PRJ”)
g=Group.create(name:”GRP1″)
g.project=p

 

Projectからgroupを参照するときは、下記を追加

 

class Project < ActiveRecord::Base

    has_many :groups
end

 

g = Group.find(1)

p = Project.find(1)

p.groups << g

 

ただし、

group.project = p

しただけでは、

p.groupsに反映されないので注意

 

 

【Rails】Userモデル作成

railsでのUserモデル/コントローラーの作成サンプル

 

  • rails new testApp
  • cd testApp
  • Gemfileの編集 gem ‘bcrypt’を有効にする。
  • bundle install
  • config/routes.rbにルーティング追記

match ‘:controller(/:action(/:id))’, via:[:get, :post]

  • rails g model User           モデルは頭文字大文字 & 単数形
  • rails g controller Users   コントローラーは頭文字大文字 & 複数形
  • app/models/user.rbに追記

class User < ActiveRecord::Base
  has_secure_password
end

  • app/controllers/users_controller.rbにアクション追加

class UsersController < ApplicationController

#CSRF Token
protect_from_forgery with: :null_session

def create

user = User.new
user.name = params[:name]
user.password = params[:name]
user.save
render text:’OK’

end

def show
users = User.all

render json: users
end
end

 

  • rails s
  • FirefoxでPOST/GETのテスト

localhost:3000/users/create

name=aaa,password=123

 

localhost:3000/users/show

 

【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

 

【Ruby】Ruby文法

エンコーディング表示

__ENCODING__

print(“endoding = “, __ENCODING__)

 

数値リテラル

123

-123

123456789    123_456_789   これもOK

 

n進数表記

2進 0b10101

8進 052

16進 0xa5

実数

小数点の表記 1.2

指数表記   12e-1

指数表記   0.12e+1

 

有理数(分数) !!!これははじめてみたな、、

1/3r      3分の1

 

複素数

42i     虚部が42

5+42i     実部が5 で虚部が42

 

文字数リテラル

シングルとダブルがあるが

ダブルクォーテーションだと、式展開と\tとか\nが使える。

 

式展開 #{xxxx}

中括弧の中身がrubyのコードとして実行される。

name=”ABC”

“My name is #{name}”

 

シンボル

:をつけた変数?

後ほど調べる。

 

ビット/シフト演算

Cと同じ

 

代入

a=1

a,b=1,2

 

多重代入

a,b,c=1,2

a -> 1

b -> 2

c -> nil

 

a,b = [1,2]    配列も可能

 

【注意】++、–はないので x+=1でやる。

 

条件文(if – elsif – else – end)

a = 2;

if a==1

        puts(“IF”)

elsif a==2

        puts(“ELSIF”)

else

        puts(“ELSE”)

end

swithcもどき

a = ARGV[0].to_i

case a

when 0

puts “0”

when 1

puts “1”

when 2, 3

puts “2か3”

else

puts “else”

end

 

繰り返し

a = ARGV[0].to_i

case a

    when 0

        puts “0”

    when 1

        puts “1”

    when 2

        puts “2”

    else

        puts “else”

end

i=1

while i<=10

        puts i

        i+=1

end

i=0;

while true

        i+=1;

        puts i

        if i>10

                break;

        end

end

i=0

while i < 10

        i+=1;

        if i % 2 == 0

                puts i;

                next;

        end

end

for obj in [“AAA”,”BBB”,”CCC”]

        puts obj;

end

for i in 0…10

        puts i;

end

[“A”,”B”,”C”].each do |str|

        puts str

end