20 days ago

rails generate 是rails用来生成模板文件的命令,可以减少很多樣板代碼的输入工作.

常用的命令

rails g model
rails g controller
rails g scaffold
rails g migration

rails g model用法

rails generate model NAME [field[:type][:index] field[:type][:index]] [options]

rails g controller用法

rails generate controller NAME [action action] [options]

rails generate scaffold用法

rails generate scaffold NAME [field[:type][:index] field[:type][:index]] [options]

rails generate migration用法

rails generate migration NAME [field[:type][:index] field[:type][:index]] [options]

區别

1-mdoel

invoke列表:
active_record
-test_unit
影響文件夾:
db/migrate/20171018012356_create_xxx_xxx.rb
app/models/
test/models/
test/fixtures/

2-controller

invoke列表:
erb
test_unit
helper
-test_unit
assets
-coffee
-scss
影響文件夾:
app/controllers/
app/views/
test/controllers/
app/helpers/
app/assets/javascripts/
app/assets/stylesheets/

3-scaffold

invoke列表:
active_record
-test_unit
resource_route
scaffold_controller
-erb
-test_unit
-helper
--test_unit
-jbuilder
assets
-coffee
-scss
scss
影響文件夾:
db/migrate/20171018012356_create_xxx_xxx.rb
app/models/
test/models/
test/fixtures/
config/ #routes.rb resources :accounts
app/controllers/
app/views/accounts
test/controllers/
app/helpers/
app/views/accounts/ #.json.jbuilder
app/assets/javascripts/
app/assets/stylesheets/

4-migration

invoke列表:
active_record
影響文件夾:
db/migrate/20171018012356_xxx_xxx.rb

<<總结>>

scaffold生成文件最多,影響範圍大,invoke關键點包括5大部分:model\resource_routes\scaffold_controller\assets\scss. 文件類型包含6種:rb\yml\erb\jbuilder\coffee\scss.

scaffold可以看作是包含了MVC的集合體,框架的框架,最小可用的最多樣板代碼文件的集成.

migration是用來修改或修正model的,可以看做是一種特殊的model.

model\scaffold\migration這三個有共同點,都調用了active_record並且都生成了db/migrate文件夾下面數字開頭的的rb文件.

所以都要需要 [field[:type][:index] ...参數,其中的type包括以下12種.

field[:type]字段類型列表

integer
primary_key
decimal
float
boolean
binary
string
text
date
time
datetime
timestamp

 
about 1 month ago

安裝
gem 'carrierwave'
gem "mini_magick"
undle後,重啟服務器。且將此頁的教程都執行完。

在 RailsRecipes 進行 Edit Event logo--選擇檔案,出現下面的錯誤:
Logotranslation missing: zh-CN.errors.messages.mini_magick_processing_error

google搜尋,謝謝echo-growth分享,提供解套方法--
1.先將 Gemfile 裡 carrierwave mini_magick 卸載,再重新安裝
2.執行 brew install imagemagick
執行完出現錯誤
Error: imagemagick 7.0.5-4 is already installed
To upgrade to 7.0.7-6, run brew upgrade imagemagick
3.執行 brew upgrade imagemagick
4.bundle install

再進行 Edit Event ,問題就解決了。

 
about 2 months ago

建立目錄指令 mkdir
例如:
在app/views下,再建立 common 目錄

mkdir app/views/common

刪除目錄指令 rmdir
例如:
刪除 app/views下,common 目錄

rmdir app/views/common

  • 打錯字,請先使用刪除目錄指令-輸入原錯誤代碼-,再重新建立目錄指令

建立檔案指令 touch
例如:
在app/views/common下,建立_footer.html.erb

touch app/views/common/_footer.html.erb

刪除檔案指令 rm
例如:
刪除 app/views/common,下 _footer.html.erb 檔案

rm app/views/common/_footer.html.erb

  • 打錯字,請先使用刪除檔案指令-輸入原錯誤代碼-,再重新建立檔案指令
 
2 months ago

Objective
應該輸入大寫,但輸入小寫,這樣也會出現 "bug"

(1) 4-5 測試登入登出流程
教程:要輸入 Log in ,但輸入 log in

(2) 5-4 測試登入登出API
教程:要輸入 Ok ,但輸入 ok

Reflective
檢查2.3遍都沒有發現,發現時,只能說"真是的"唉"
終於找到了,又過一關。

Interpretive
再一次證明編程的世界,不容許一絲一毫錯誤。就像每個螺絲釘要栓緊一樣,一個最小的螺絲釘鬆脫了,會影響到整體的運作。

Decisional
繼續探索,前進。

 
2 months ago

使用 rails-erd 这个 gem 可以分析 Rails 产生 ERD 图表,分析手上的项目。

step1: 安装 graphviz 工具。

Mac
在Terminal執行 brew install graphviz

step2: 安裝 gem 'rails-erd'

Gemfile 加入這行
gem 'rails-erd'
在Terminal执行 bundle install

step3: 在Terminal执行 bundle exec erd

会在本地生成一個‘erd.pdf’ 文件

step4: 在Terminal执行 open .

打開這個項目專屬的資料夾,會搜尋到 ‘erd.pdf’,點選打開,即出現。

 
3 months ago

Objective
在 Web API 實作 遇到兩個bug

1.在3-7教程https://fullstack.xinshengdaxue.com/posts/1021
在Postman 輸入完Body參數 send送出
得到 "訂票失敗 seat_number: "can't be blank"的結果
反覆檢查輸入code(先用手打輸入),後來用粘貼,還是得到一樣的結果
最後回到Postman上,在輸入Body參數最右邊 "Bulk Edit"按一下,切換為 Key-Value Edit
看到
train_number:0822
seat_number .....................:5A
custer_name..........:gitz
custer_phone:88888888
上面 ..........為空格,手動可以刪除空格(但在輸入Body參數時,完全沒有空格),刪除後,
就解除了這個 bug.

2.在7-5教程https://fullstack.xinshengdaxue.com/posts/1041

畫面和教程不一樣,也反覆檢查,後詢問Slack助教,知道檔名打錯
修改方式:
原生成檔案 touch app/views/api/v1/trains/index.json.jubilder
刪除檔案 rm app/views/api/v1/trains/index.json.jubilder
再生成檔案 touch app/views/api/v1/trains/index.json.jbuilder
解除了這個bug.

Reflective
出現bug,真的考驗耐心。
解了就真的豁然開朗。

Interpretive
覺得手打code, 雖會遇到bug,但會開始去尋求解決的方法,是很好的學習。

Decisional
繼續往前,並復習之前的教程。

 
3 months ago

&&參考特別推薦--blog.xdite.net

helper_method

在 controller 裡面的 method 不能在 view 裡面用。

也就是在

class ProductsController
def find_cart
@cart = Cart.find(session[:cart_id])
end
end
View 裡面不能用

<%= find_cart.items %>

拉這個 cart 出來直接用。

如果你要在 controller 和 view 都能拉現在的購物車,必須要用 helper_method 宣告這是一個 controller 級的 helper。

class ApplicationController
helper_method :current_cart
def current_cart
cart = Cart.find(session[:cart_id])
return cart
end
end

這樣你就能在 View 裡面用 current_cart。

<%= current_cart.items %>

或者是 Controller 裡面也能用 current_cart。

class ProductsController
def add_to_cart
find_cart.items << @product
end
end
view_context
在 helper 裡面的 method 不能在 controller 裡面用。
也就是在

class ProductsController
def show
@page_description = truncate(@product.desc, :lenght => 50 )
end
end
是不會動的。

如果要在 controller 裡面取用系統內建的 Rails View Helper,或自定義的 View Helper。
必須要用 view_context 去調用。

class ProductsController
def show
@page_description = view_context.truncate(@product.desc, :lenght => 50 )
end
end

小結
但基本上還是建議在 View Helper 與 Controller 的 code 不要互相混來呼叫來呼叫去。讓 View 歸 View,Controller 歸 Controller。若真有業務上的需求需要「到處都可以用」。建議寫 Module 掛在 lib 用 mixin 技巧混入。

 
3 months ago

&&參考特别推荐!!!捷姆斯——Rails中的 session 與 cookie

什麼是 session

舉個簡單的例子

我去買雞排,結帳後老闆給我一張號碼牌
等到炸好後在用號碼牌來領雞排

session 就是那張號碼牌,由那家雞排店的老闆發給你,記得這個雞排是誰的

在Rails中,每個新的使用者進入到網站,且需要用到session時,會自動產生一組給該使用者

識別方法:利用亂數產生32byte的數字(16進制)欄位id

這個id會在seesion產生時,也順便存在Client端的cookie中,供以後使用

除了識別欄位,session還允許你存入你想要存的資料

不過由於大小有限,儲存資料越簡單越小越好

以下列出使用session建議

可以存入的資料:數字、字串
不可以存入的資料:Object
關鍵性資料建議不要儲存
經常變動的資料建議不要存

什麼是 cookie

剛剛的 session 是你每次去雞排店,都會拿到新的一張號碼牌

而cookie就是那間雞排店發給你一張會員卡,記錄你的個人相關資訊

既然會員卡放在使用者身上

使用者可以自行丟掉(自行刪除cookie)
到期日到了自動失效(cookie過期會不能使用)
也就是說,我把一些不重要的資訊,存在使用者的電腦中
下次使用者進來,我可以很快的知道他的喜好

它的儲存空間為 4kb

為什麼要用 session 跟 cookie?

我們要先知道 HTTP 是 一個 stateless(無狀態) 的 protocol

什麼意思?

沒有session,伺服器就不能識別,誰正在使用我的網站

那為什麼要用cookie?

使用者跟伺服器沒有一直保持連線的狀況,所以在Cline操作的時候
可以將資料存在cookie,需要連線時在一起將資料送給server

可以想成,跟店家拿菜單,自己畫好要吃什麼後,在送給店家處理

就是伺服器不想要記住所有人的個人化資訊,你提供給我即可

Rails 內如何操作 session?

指定:session[:cart_id] = cart.id
讀取:session[:cart_id]
刪除:session[:cart_id] = nil
清空:reset_session

 
3 months ago

在Rails中下面幾種情況被定義是blank:

nil或是false
只由空白組成的字串
空陣列或是空Hash
任何物件當使用empty?方法呼叫時回應為true時
在Ruby1.9中的字串支援辨識Unicode字元,因此某些字元像是U2029(分隔線也會被視為是空白。
以數字來說,0或是0.0並不是blank

舉例來說在ActionDispatch::Session::AbstractStore中就使用了blank?方法來確定session key是否存在:

def ensure_session_key!
if @key.blank?
raise ArgumentError, 'A key is required...'
end
end

present?方法就是blank?方法的相反,判斷是否存在,因此present?方法與!blank?方法兩者表達的意思是一樣的。

 
3 months ago

||= 是什麼意思?
首先“||=” 是在ruby裡面是一個條件運算符号。

通常的解釋是 a || = b ===》 a || a = b但是這樣並不是特别準確。

這個解釋表示“如果 a 是false,nil 或者 undefined,那麼評判 b 並且將结果設置判定给 a 。

在ruby‘s 短回路計算中這樣解释:如果 a 是定義過的或者判定是 true,那麼運算符號右手邊的值就不會被判定,也就没右手邊的值什么事了。

當 a 和 b 都是 本地 變量时,區别不重要。但如果它們是類别的 獲得/設置 方法 那就很重要了。

比如:

a ||= 1;
=> 1
a ||= 2;
=> 1

foo = false;
=> false
foo ||= true;
=> true
foo ||= false;
=> true

這例子很好的解释了,當 a 已经定義好,那麼 a 就是那本身的值。
如果 a 是false ,那麼 a 就會 判定 b 值 並將结果設置為 a 的值。當 a 的值再次定義好後,就不会理 b 值了。