SuzuBlog

webのお勉強はじめたばかりの初心者。備忘録

Rails基礎② scaffold

scaffoldを使用して雛形を作成する

scaffoldとは?

Railsアプリケーションの作成時には

モデル・ビュー・コントローラー

更にそれに対するルーティングを作成する必要があるが、

その作業をまとめて行い、雛形を作成してくれる機能。

やってみる

Railsアプリケーションの雛形を作成
$ rails new scaffold_sample
作成されたディレクトリに移動
$ cd scaffold_sample
scaffoldを実行
$ rails g scaffold myblog title:string body:text

myblogというモデル名で

タイトル…短い文字列

本文…長い文字列

を持った雛形を作成します。

このコマンドの書式は以下

$ rails generate scaffold モデル名 カラム名1:データ型1 カラム名2:データ型 2 …

generategが短縮形です。

テーブルの作成

アプリケーションの雛形は上記コマンドで出来上がるのですが、

最後にデータベースのテーブルに対するアクションが必要になります。

$ rails db:migrate

これで準備ができたのでサーバーを立ち上げ、URLの後ろに/myblogsと入れます 複数形なので注意 f:id:hpsuzucat:20201017151050p:plain

これで以下のようなページが表示されれば成功です

f:id:hpsuzucat:20201017150159p:plain f:id:hpsuzucat:20201017150223p:plain f:id:hpsuzucat:20201017150237p:plain f:id:hpsuzucat:20201017150252p:plain

たった数個のコマンドを実行するだけで、プログラムを書かずに

新規投稿、編集、削除までできるアプリケーションを作成することができました。

指定できるカラムの型

データ型 説明
string 文字列
text 長い文字列
integer 整数
float 浮動小数
decimal 精度の高い小数
datetime 日時
timestamp より細かい日時
time 時間
date 日付
binary バイナリデータ
boolean Boolean型
参考

railsdoc.com

Rails基礎① Railsのインストール、サーバーの立ち上げ

Railsのインストール

Railsを動作させるにはRubyとデータベースが必要

バージョンの確認

$ Ruby -v

$ sqlite3 --version

Railsのインストール

$ gem install rails --no-document 

Railsのバージョン確認

$ rails -v 

アプリケーションの作成

$ rails new appname
オプション
オプション 説明 デフォルト値
-r, -ruby=PATH rubyバイナリのパス
-m, -template=TAMPLATE テンプレートのパス
–skip-gemfile Grmfileを作成しない
ーB, –skip-bundle bundle installしない
-G, –skip-git .gitignoreを組み込まない
–skip-keeps .keepを組み込まない
-O, –skip-active-recode active recordを組み込まない
-S, –skip-sprockets sprocketsを組み込まない
–skip-spring springアプリケーションをインストールしない
-d, –database=DATABASE データベースの種類 sqlite3
-j, –javascript=JAVASCRIPT 組み込むJavaScriptライブラリーを指定。 jquery
-J, –skip-javascript javascriptを組み込まない
–dev github リポジトリ上の自分のコードから作成
-M, –skip-action-mailer Action Mailerを組み込まない
-P, –skip-puma Puma関連のファイルを生成しない
-C, –skip-action-cable Action Cableを組み込まない
–edge github リポジトリ上の最新のコードから生成
-T, –skip-test-unit test::unitを組み込まない
–rc=RC
–no-rc
-f, –force ファイルが存在する場合に上書きする
-p, –pretend ドライラン
-q, –quiet 進捗情報を表示しない
-s, –skip 既に存在するファイルについてはスキップ
-h, –help ヘルプ
-v, –version バージョンを表示
–skip-turbolinks Turbolinksをスキップ false

IPアドレスの確認

 $ ip a

Railsサーバーの立ち上げ

 $ rails server -b 192.168.XX.XX -d

-dはバックグラウンドで動かすためのオプション

オプション
オプション 説明 初期値
-p, –port=port サーバを起動するときのポート番号を指定 3000
-b, –binding=ip バインドするIPアドレスを指定 0.0.0.0
-c, –config=file rackupファイルを指定 -
-d, –daemon デーモンとしてサーバを起動 -
-u, –debugger デバックモード -
-e, –environment=name 環境(test/development/production)を指定してサーバを起動 development
-P, –pid=pid PIDファイルを指定 tmp/pids/server.pid
-h, –help ヘルプを表示 -

バックグラウンドで動かしたWEBサーバーを停止する

 $ cat tmp/pids/server.pid

で番号を調べ

 $ kill -9 XXXXX

で、終了

ログの確認

 $ tail log/development.log

オプション等はこちらのサイトから

railsdoc.com

めちゃくちゃ色々載ってて便利

Ruby基礎④

アクセス権

共通

#アクセス権
# -public =>デフォルト、どこからでも呼び出し可
# -protected
# -private: レシーバーを指定できない

# publicでもnewしたときに呼ばれるinitializeメソッド、クラスの外に書いたメソッドは自動的にprivateになる

class User
    
    def sayHi
        puts "hi!"
        sayPrivate
        # self.sayPrivate
    end

    private 
    def sayPrivate
        puts "private"
    end

end

継承されたクラス内メソッドでの呼び出しも可能

class AdminUser < User

    def sayHello
        puts "hello!"
        sayPrivate
    end
end

# User.new.sayPrivate #NG(クラスの外からの呼び出し)

User.new.sayHi
AdminUser.new.sayHello

出力結果

hi!
private
hello!
private

同じ名称でオーバーライドした場合

class AdminUser < User

    def sayPrivate
        puts "private from Admin"
    end

end

User.new.sayHi
AdminUser.new.sayPrivate

出力結果

hi!
private
private from Admin

モジュール

名前空間
#モジュール(module) => クラスのようにメソッドや定数をまとめることができる
#インスタンスを作ったり継承したりはできない
#モジュール名の先頭は大文字であること
# - 名前空間を作ることで、名称の衝突を防ぐ
module Movie

    VEWSION = 1.1

    def self.encode
        puts "encoding..."
    end

    def self.export
        puts "exporting..."
    end

end

Movie.encode
Movie.export
p Movie::VEWSION

出力結果

encoding...
exporting...
1.1
ミックスイン
# module
# - ミックスイン
# selfをつけずに単にインスタンスメソッドにしてあげると、
# 他のクラスのインスタンスメソッドとしてはめ込むことができる
# 継承関係にない複数のクラスに共通の機能を提供する場合に便利
module Debug

    def info
        puts "#{self.class} debug info ..."
    end

end

class Player
    include Debug
end

class Monster
    include Debug
end

Player.new.info
Monster.new.info

出力結果

Player debug info ...
Monster debug info ...

例外

# x = gets.to_i
# p 100 / x

#上記だと0が渡された際に0除算となりエラーになってしまう
class MyError < StandardError; end #Rubyの標準的な例外クラスを継承

x = gets.to_i

begin
    if x == 3
        #3が入力されたときは任意のエラーを出す
        raise MyError
    end
p 100 / x
rescue MyError
    puts "not 3!"
rescue => ex # => ex のように描くと例外を入れてくれる
    p ex.message
    p ex.class
    puts "stopped!"
ensure
    puts "-- END --"
end

Ruby基礎③

ループ処理

while
i = 0

while i < 10 do
    puts "#{i}: hello!"
    i += 1
end

出力結果

0: hello!
1: hello!
2: hello!
3: hello!
4: hello!
5: hello!
6: hello!
7: hello!
8: hello!
9: hello!
times
10.times do |i|
    puts "#{i}:hello"
end

#1行であれば省略記法が使用できる
10.times { |i| puts "#{i}:hello" }

出力結果

0:hello
1:hello
2:hello
3:hello
4:hello
5:hello
6:hello
7:hello
8:hello
9:hello
for
#数値
for i in 15..20 do
    p i
end

#配列
for color in ["red","blue"] do
    p color
end

#ハッシュ
for name,score in {tanaka:200,suzuki:400} do
    puts "#{name}: #{score}"
end

出力結果

15
16
17
18
19
20
"red"
"blue"
tanaka: 200
suzuki: 400
each
#数値
(15..20).each do |i|
    p i
end

#配列
["red","blue"].each do |color|
    p color
end

#ハッシュ
{tanaka:200,suzuki:400}.each do |name,score|
    puts "#{name}: #{score}"
end

出力結果

15
16
17
18
19
20
"red"
"blue"
tanaka: 200
suzuki: 400
loop
i = 0

loop do
    p i
    i += 1
end

出力結果

0
1
2
3
4
.
.
.
無限ループ
break
#iが7になったら処理を中断する
10.times do |i|
    if i == 7 then
        break
    end
    p i
end

出力結果

0
1
2
3
4
5
6
next
#iが7のときに処理をスキップする
10.times do |i|
    if i == 7 then
        next
    end
    p i
end

出力結果

0
1
2
3
4
5
6
8
9

メソッド

メソッド基本
#基本形
def メソッド名
    処理
    最後の一行が戻り値
end

#引数あり
def メソッド名(引数名)
    処理
end

#引数あり+引数デフォルト値設定
def メソッド名(引数名 = デフォルト値)
    処理
end
def sayHi(name = "suzuki")
    puts "hi!#{name}"
    return "hi!#{name}"
end

sayHi "tanaka"
sayHi

 p sayHi

出力結果

hi!tanaka
hi!suzuki
hi!suzuki
"hi!suzuki"

クラス

クラス基本
class クラス名
    def initialize(引数名)
        @変数 = 引数名
  #以降@変数をクラス内各メソッドで使用できる
    end
end

#呼び出し
変数 = クラス名.new(引数)
class User
 
 #アクセサー
    attr_accessor :name
    # attr_reader :name
    # setter: name=(value)
    # getter: name

    def initialize(name)
        @name = name
    end

    def sayHi
        # self
        # self.name => @name
   #引数が1つの場合はselfも省略できる
        puts "hi!! i am #{@name}"
        puts "hi!! i am #{self.name}"
        puts "hi!! i am #{name}"
    end
end

tom = User.new("tom")

tom.name = "tom Jr."
p tom.name

tom.sayHi

bob = User.new("bob")
bob.sayHi # レシーバー

出力結果

"tom Jr."
hi!! i am tom Jr.
hi!! i am tom Jr.
hi!! i am tom Jr.
hi!! i am bob
hi!! i am bob
hi!! i am bob

クラスメソッド・クラス変数・定数

class User

    @@count = 0 #クラス変数(@@を先頭につける)
    VERSION = 1.1 #クラス定数(全て大文字)

    def initialize(name)
        @@count += 1
        @name = name
    end

    def sayHi
        puts "hi! i am #{name}"
    end

    def self.info #クラスメソッド
        puts "#{VERSION}: User Class, #{@@count} instances."
    end
end

tom = User.new("tom")
bob = User.new("bob")
steve = User.new("steve")
User.info #クラスメソッドにアクセス
p User::VERSION #定数にアクセス

出力結果

1.1: User Class, 3 instances.
1.1

参考になりそうな記事 qiita.com

クラスの継承
class User

    def initialize(name)
        @name = name
    end

    def sayHi
        puts "hi! i am #{@name}"
    end

end

# User: 親クラス、Super Class
# AdminUser: 子クラス、Sub Class

#クラスの継承には「<」を用いる
class AdminUser < User

    def sayHello
        puts "Hello from #{@name}"
    end

    #同じメソッド名をつけることでオーバーライド
    def sayHi
        puts "hi! from admin!"
    end

end

tom = AdminUser.new("tom")
tom.sayHi
tom.sayHello

出力結果

hi! from admin!
Hello from tom

Ruby基礎②

ハッシュ

Key/Valueで管理する 省略記法があるので、 以下の3パターンはどれも結果が同じになる

scores = {"tanaka" => 200, "suzuki" => 300}
scores = {:tanaka => 200, :suzuki => 300}
scores = {tanaka: 200, suzuki: 300}

出力

p scores[:suzuki]

値を書き換えることも可能

scores[:tanaka] = 500
p scores
p scores.size #要素数
p scores.keys #Key一覧を返す
p scores.values #Value一覧を返す
p scores.has_key?(:tanaka) #指定したKeyが存在するか真偽値を返却する

オブジェクトの変換

x = 50
y = "3"

p x + y.to_i #int型への変換
p x + y.to_f #float型への変換
p x.to_s + y #String型への変換

score = {tanaka: 200, suzuki: 500}

p scores.to_a.to_h #配列/ハッシュへの変換

%記法

#ダブルクォーテーションを出力すためにバックスラッシュが必要
puts "he\"llo" 
puts 'he\'llo'
#%記法を使用するとストレートに記述することができる
#%Q、%...ダブルクォーテーションで括った場合と同じ。Qは省略可能
#%q...シングルクォーテーションで括った場合と同じ
puts %Q(he"llo)
puts %(he"llo)
puts %q(he'llo)

配列にも使用可能。 その場合は%W,%wを使用する

p ["red","blue"]
p ['red','blue']
p %W(red blue)
p %w(red blue)
書式付きで文字列を埋め込む
p "name: %s" % "tanaka"

#桁数指定
p "name: %10s" % "tanaka"
#結果=> "name:    tanaka"

#桁数指定+左寄せ
p "name: %-10s" % "tanaka"
#結果=> "name:tanaka    "

p "id: %05d, rate: %10.2f" % [123, 1.567]
#結果=> "id:00123, rate:         1.57"

#printf sprintfでも使える

printf("name: %10s\n","tanaka")
printf("id: %05d, rate: %10.2f\n" ,123, 1.567)

p sprintf("name: %10s\n","tanaka")
p sprintf("id: %05d, rate: %10.2f\n" ,123, 1.567)

if文

# > < >= <= == !=
# &&(AND) ||(OR) !(NOT)

score = gets.to_i

if score > 80 then
    puts "great!"
elsif score > 60 then
    puts "good!"
else
    puts "so so..."
end

thenは省略可能

# > < >= <= == !=
# &&(AND) ||(OR) !(NOT)

score = gets.to_i #ユーザから入力された値を使用

if score > 80
    puts "great!"
elsif score > 60
    puts "good!"
else
    puts "so so..."
end

条件が1つの場合は以下のようにも書ける

puts "great!!" if score >= 85

case文

#.chomp(改行を削除)

signal = gets.chomp

case signal
when "red" then
    puts "stop!"
when "green","blue" then
    puts "go!"
when "yellow" then
    puts "caution!"
else
    puts "wrong signal"
end

こちらもthenを省略可能

#.chomp(改行を削除)

signal = gets.chomp

case signal
when "red"
    puts "stop!"
when "green","blue"
    puts "go!"
when "yellow"
    puts "caution!"
else
    puts "wrong signal"
end

Ruby基礎①

1年ぶりに勉強再開。 ドットインストールの内容メモ

出力メソッド

printメソッド

改行なしで値を出力

putsメソッド

改行付きで値を出力

pメソッド

値に加えて型情報も出力される 文字列はダブルクォーテーションで囲まれたまま出力されるような感じ

printf

書式を指定して出力

変数・定数

変数

変数の場合はアルファベット小文字を使用する 例:name

定数

定数の場合はアルファベット大文字で始める 例:NAME

定数に値を代入しようとするとエラーが出るものの、処理は中断されない。 エラーは放置しないように注意

StringClass

.length

文字列の長さを返却する

.reverse

中身を反転させて出力させる

FloatClass

.round

四捨五入

.floor

小数点以下切り捨て

.ceil

小数点以下切り上げ

数値オブジェクト

.class

クラス情報を参照する

.methods

使用できるメソッドを確認する

分数

以下のように書く

p Rational(2,5) + Rational(2,5)
2/5r + 2/5r

のように表現することも可能

文字列オブジェクト

puts "hell\no worl\td"

上の例の場合、ダブルクォーテーションのときは改行とタブが反映されるが

puts 'hell\no worl\td'

の場合は入力されたものをそのまま出力する

puts "price #{3000 * 4}"

=> price 12000
puts 'price #{3000 * 4}'

=> price #{3000 * 4}

また、変数を渡すことも可能。その場合は

name = "taro"

puts "hello #{name}"

のように記述する。

文字の連結
puts "hello" + "world"
=> helloworld
文字の繰り返し
puts "hello" * 10
=> hellohellohellohellohellohellohellohellohellohello

!

upcase upcase! 破壊的なメソッド downcase reverse

name = "taro"

puts name.upcase => TARO

puts name => taro

puts name.upcase! => TARO

puts name => TARO

のように保持される

? 真偽値 true false

hello = "Hello World!!"

p hello.empty? => false

p hello.include?("l") => true

配列

colors = ["red","blue","yellow"]

p colors[0]

=> "red"

p colors[-1]

=>"yellow"

p colors[0..2]

=> ["red","blue","yellow"]

p colors[0...2]

=> ["red","blue"]

p colors[5]

=>nil

colors[0] = "pink"

colors[1..2] = ["white","black"]

colors.push("gold")

colors << "silver"

p colors

=> ["pink","white","black","gold","silver"]

p colors.size

=>5

p colors.sort

=> ["black","gold","pink","silver","white"]

Bootstrapを使用して簡単な問い合わせフォームを作る

Bootstrapを使用して簡単な問い合わせフォームを作る

Bootstrapを使用するとCSSの記述をほぼすることなく、問い合わせフォームを作ることが出来ました!(送信ボタンは機能しませんのでご注意ください)

See the Pen JjjvWQL by すず@progateでお勉強はじめました (@hpsuzucat) on CodePen.

使用したもの

card

これを使用することで、ぐるっとフォームをイマドキなborderで囲ってくれます。

bg-dark text-light

暗い背景+白文字がこれだけでできちゃう。すごい。

row,col

rowの中にcolを入れることで、

姓名は同じ行、メールアドレスは次の行…のように指定してあげることが出来ます。

また、姓と名はcol-4、メールアドレスはcol-8とすることで合計値が8になるので幅がキレイに揃っています。

form-control

これを入力フォームに渡すことで、入力状態のときにふわっと周りを青く囲ってくれます。わかりやすい…!

btn btn-outline-dark float-right w-25

ボタンにはこれを記述するだけで、

ボタンの見た目、右寄せ、サイズを指定しています。

試していただけるとわかるのですが、マウスオーバーでポインタの形が変わったり背景色が自然に変わっています。

これを記述するのはCSSだと地味にボリュームがあるので、かなり便利だと思います。

getbootstrap.com

hackerthemes.com