Jimmy's Code

Want to be a better Coder
^

Ruby 筆記

2018-11-04

Ruby基礎

變數與輸入輸出

puts 'Hello World' #output Hello World
puts 20+2 #output 22
puts 20-2 #output 18
puts 20*2 #output 40
puts 20/2 #output 10
name='John' #no output
puts name #john
name=gets.chomp #get user input
puts 'Hello'+name #output Hello John
print 'Hello world' #不會換行 output Hello World
  • puts 印出資料 (換行)
  • print 印出資料(不換行)
  • gets.chomp 取得輸入
  • + 將兩個文字串接

  • boolean: true 和 false

Tips:
\= 指派相等
\== 比較是否相等
!= 比較是否不相等

irb

  • irb 是一個ruby 的命令介面,可以即時執行ruby 結果
  • control+l 清空
  • exit 離開

if …else…end

  • # 註解
#number =8
number = Random.rand(9)
#隨機產生0-9 的數字
print("請猜一個1~15之間的數字")
guess=gets.chomp.to_i
#to_i 轉換為數字

if guess == number # '8' != 8
puts '猜對了,答案是'+number.to_s
#to_s 轉換為字串
else
puts '猜錯了!'
end

while…end

#上一個的進階版
number = Random.rand(14)+1
#while guess==number #迴圈
while true
print("請猜一個1~15之間的數字")
guess=gets.chomp.to_i
if guess == number # '8' != 8
puts '猜對了,答案是'+number.to_s
break;
else
if guess > number
puts '猜錯了! 太大了'
else
puts '猜錯了! 太小了'
end
end
end

Array

scores= [80,100,90,99] #定義一個名為scores 的array
scores.each do |score|
puts score
end
#另外一種寫法
scores.each {|score|puts score}

print(scores[0]) ## 印出第一個ruby array 值
print(scores.pop(2)) ## 教最後兩個叫出來 [90,99]
print(scores.pop) # 將最後一個叫出來 [99]
print(scores.sort) # 排序 [80,90,99,100]

成績管理程式-綜合應用

# 1=>檢視成績 2 新增成績 3 刪除成績 4 結束成績
scores=[90,88,85]
puts '輸入 1 檢視成績、2 新增成績、3 刪除成績、4 結束程式'
while true
print '>'
command = gets.chomp.to_i

if command == 1
scores.each do |score|
puts score
end
end
if command == 2
print '請輸入要新增的成績:'
scores.push gets.chomp.to_i
end
if command == 3
print '請輸入要刪除的成績位置:'
scores.delete_at (gets.chomp.to_i-1)
end
if command == 4
puts '程式結束!'
break
end
end

Hash

record={'name'=>'john','score'=>90}
records={:name=>'john',:score =>90}

puts record[name] #john
puts record[score] #90

puts records[:name] #john
puts records[:score] #90

record.each do |key,value|
puts key
puts value
end
````

## method
```ruby
def greet
puts 'hello'
end

greet #=> hello
#def method_name....end
def greet(name)
puts 'hello,'+name
end

greet 'John' #=> hello,John

require_relative 'method' #引入該資料夾底下的method.rb
</code></pre>

<h2>object</h2>

<ul>
<li><em>在ruby 世界中 任何東西都是一種物件</em></li>
</ul>

<pre><code class="language-ruby">class Robot
attr_accessor :power,:score...
def initialize(power,score)
@power - power
@score = score
end
def move_forward
# @power
puts '往前走'
end
end

robot1 = Robot.new 1.0
robot2= Robot.new 2.0
robot1.move_forward # 往前走

class Robot < Things //< 代表繼承 attr_accessor :power,:score... def initialize(power,score) @power - power @score = score end def move_forward # @power puts '往前走' end end ``` ## gem &gt; gem -v
> eg.gem install colorize
> **gem 安裝套件是裝在機器裡面的而非單個資料夾**

## Ruby on rails
### scaffold 指令

```bash
rails generate scaffold record title:string cost:integer
rails db:migrate
</code></pre>

<h3>terminal 終端機命令複習</h3>

<pre><code class="language-bash">mkdir 創建資料夾
cd 移動
touch 創建檔案
rm 檔案名稱
//tab鍵 可以補齊
rmdir 移除資料夾
rm -rf test* 移除test 所有子資料夾
</code></pre>

<h3>rails 指令</h3>

<ul>
<li>rails new static-app</p></li>
<li><p>rails s (-b $IP -p $PORT)(C9 特殊設定)</p></li>
<li><p>c9 website: https://first-c9-r567tw.c9users.io/</p></li>
<li><p>rails controller 生成</p></li>
<li>rails g controller pages</li>
<li><p>在app/controller 底下會出現pages_controller.rb</p></li>
<li><p>rails route
-在config /routes.rb</p></li>
<li>route 寫法</li>
</ul>

<pre><code class="language-ruby">get '/about' => 'pages#about' //進入about 路由後啟動pages_controller.rb 裡的about function

class PagesController < ApplicationController def about #render plain:'hello wolrd' render file:'pages/about' #去找views/pages 裡的about.html file ->預設從views 資料夾為起點
#如果有依照命名慣例,甚至只要有def..end 就好 裡面空空沒關係
end

def index
#直接找pages 底下的index.html
end
end
</code></pre>

<ul>
<li>rails views
在app/views 資料夾裡</li>
<li>命名規則</li>
<li><p>PagesController 裡面的about 方法=> 將檔案建立在views>pages>about.html</p></li>
<li><p>layout 部份</p></li>
<li>在view/layout/application.html.erb 將layout 統一定義起來</li>
<li><p>在 app/assets/application.css 定義引入的css</p></li>
<li><p>gem=> 安裝Ruby 的套件</p></li>
<li>yarn => 安裝 js,css 等前端的套件</li>
<li>引入外部css 與js</li>
<li><strong>在app/assets/application.css require</strong></li>
<li>從node_modules 開始算</li>
</ul>

<pre><code>*= require bulma/bulma
</code></pre>

<ul>
<li>erb 就是一個可以在html 寫ruby 語法的附檔名</li>
</ul>

<pre><code class="language-ruby"><% #ruby...... %>
<%= 將ruby 語法執行完在貼回去 %>
# 只要在controller 裡的方法宣告資料 例如 @data=....
# 也不用特別render (除非是特別不按照命名慣例)
# 就可以在前面使用 <%= @data %> 把資料印出來
# each 用法
<% @datas.each do |data| %>

<%=data %>

<% end %>
</code></pre>

<p>補充
<%= 'is_active' if current_page?'/' %>

<ul>
<li>rails model
> rails g model store</li>
</ul>

rails db migrate

<pre><code class="language-ruby"># db/migrate/....create_stores.rb
class CreateStores < ActiveRecord::Migration[5.1] def change create_table :stores do |t| t.string :name #建立一個name 的字串欄位 t.string :description t.string :phone t.timestamps end end end ``` &gt; 執行 rails db:migrate
[migration 教學](http://guides.rubyonrails.org/active_record_migrations.html)
> rails console //類似 php artisan tinker
- activeRecord 模式 #store 為model name 可替換
- Store.new / store.save
- Store.create
- Store.all
- Store.find
- store.update
- store.destroy

### Ruby-rails-Form
```ruby
#表示json 格式輸出
render json:params
#csrf_token token
<input name="authenticity_token" type="hidden" value="<%=form_authenticity_token%>" />
  • create
def create
store = Store.new
#<input name="store[name]" type="text" />
store.name = params[:name]
# store.description = params[:description]
# store.phone = params[:phone]
# store.address = params[:address]
store = Store.new store_params

#store.save

redirect_to '/stores'
#redirect_to stores_path
end

private
def store_params
#設定欄位的白名單
params.require(:store).permit(:name, :description, :address, :phone)
end
end

補充:<% truncate store.description, length:20 %>

rails routes 指令 列出route 的別稱及路由

  • form helper
<% form_for Store.new do |f|%>
<% f.label :name,'店家資訊' %>
<% f.text_field :name %>
...(略)
<% f.submit '送出' %>
<% end %>
  • read/show

route: get ‘/stores/:id’ => ‘stores#show’

def show
@store = Store.find params[:id]
end
  • update
    route: get ‘/stores/:id/edit’ => ‘stores#edit’
    route: patch ‘/stores/:id’ => ‘stores#update’
# <%= link_to edit_store_path(store),class: 'button is-small is-primary is-outlined is-edit' do %>
def edit
@store = Store.find params[:id]
end
#<%= form_for @store do |f| %>
def update
@store = Store.find params[:id]
@store.update store_params
redirect_to stores_path
end

*補充 partial html==> render ‘name’ => _name.html.erb
– delete
route: delete ‘/stores/:id’ => ‘stores#destroy’

#<%= link_to 'delete', store_path(@store), method: :delete, data: { confirm: '確定要刪除嗎?' } %>
def destroy
@store = Store.find params[:id]
@store.destroy

redirect_to stores_path
end
  • 慣例及優化
    route: resource :stores
    before_action :set_store,only:[:show,:edit,:update,:destroy]
def set_store
@store=Store.find params[:id]
end
class Store < ApplicationRecord
validates_presence_of :name, :phone, :address, :description
# validates :name,presence:true
# validates :phone,presence:true
end
#in stores controller
if @store.save
redirect_to stores_path
else
render 'new'
end
  • 顯示錯誤資訊
<% @store.errors.full_messages_for(:phone).each do |msg| %>
<p class="help is-danger"><%= msg %></p>
<% end %>
  • 上傳圖片
    外掛使用:https://github.com/carrierwaveuploader/carrierwave

migration -> uploader 生成-> 與model activerecord 連結->controller 加入白名單->調整form 上傳等~

  • relationship
  • bcrypt gem 外掛–>加密
  • devise gem 外掛 ->>登入登出
  • cocoon gem 外掛 -> 可以動態新增表單的東西

  • 使用者故事

  • trello
  • 主詞
  • 可以做甚麼
  • 流程
  • 開發的流程
  • todos
  • test
  • coding
  • code review
  • staging 初步測試
  • production

  • 下一步

  • introduction to programming with ruby
  • rails guild
  • ruby on rails 實戰聖經
  • 為自己學ruby on rails
  • rails casts
  • rails go

r567tw

住在台北的一位台東developer,最喜歡"忠心"這個形容詞。這一生希望完成三件事:寫一本書、站在TED演講並且想要成為福音及各種學科的橋梁,希望自己能從基督教的思考框架出發與各學科傾聽、回應、對話