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 …
generate
はg
が短縮形です。
テーブルの作成
アプリケーションの雛形は上記コマンドで出来上がるのですが、
最後にデータベースのテーブルに対するアクションが必要になります。
$ rails db:migrate
これで準備ができたのでサーバーを立ち上げ、URLの後ろに/myblogs
と入れます
複数形なので注意
これで以下のようなページが表示されれば成功です
たった数個のコマンドを実行するだけで、プログラムを書かずに
新規投稿、編集、削除までできるアプリケーションを作成することができました。
指定できるカラムの型
データ型 | 説明 |
---|---|
string | 文字列 |
text | 長い文字列 |
integer | 整数 |
float | 浮動小数 |
decimal | 精度の高い小数 |
datetime | 日時 |
timestamp | より細かい日時 |
time | 時間 |
date | 日付 |
binary | バイナリデータ |
boolean | Boolean型 |
参考
Rails基礎① Railsのインストール、サーバーの立ち上げ
Railsのインストール
バージョンの確認
$ 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
オプション等はこちらのサイトから
めちゃくちゃ色々載ってて便利
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だと地味にボリュームがあるので、かなり便利だと思います。