ruby on rails

ruby on rails

require、require_relative是什麼意思?差在哪?

雖然Ruby本身已經有非常多的功能,但還是常常在Ruby檔案中看到require 'something',例如要使用JSON.parse就必須先require 'json',如果不require就無法使用這些功能。到底這些在檔案最開頭的玩意兒代表什麼意思呢?如果不require又會怎麼樣? require最常見的意義 Ruby內建有許多library,在執行.rb檔案時就已經包含在程式內,包括常用的File、Date等等三不五時就會出現的class,這些因為大家常用,就直接在開始執行.rb程式時包含在Ruby內。但如果載入Ruby時就把所有libraries都放進去,啟動時間會太久,因此Ruby將許多比較沒那麼常用到的class抽出,需另外require。很常見的例子是require 'digest',是一個專門產生亂數、轉碼的工具: Digest::SHA256.hexdigest("HelloWorld") # => NameError: uninitialized constant Digest require 'digest' Digest::SHA256.he

ruby on rails

模擬class物件:Ruby當中Struct及OpenStruct的使用

為什麼我們需要模擬class物件呢?主要是一個物件有一些屬性需要存取,例如一篇文章Post底下需要title和content兩個屬性,用class來存取就是用牛刀殺雞,太過複雜,用簡單的Hash存取即可。 但Hash其實在某些功能上過於簡單,存取的功能較不方便,假如要模擬的class更為複雜,就需要OpenStruct協助。 OpenStruct OpenStruct跟Hash一樣可以自帶屬性: require 'ostruct' # OpenStruct class不包含在原本Core物件當中,因此需要先require book = OpenStruct.new(title: "Harry Potter", episodes: 7) # 讀取 book.title # => "Harry Potter" book[:title] # => "Harry Potter" book["title"] # => "

ruby on rails

RSpec-Rails 針對module進行unit test

本文概要:在RSpec describe中載入module必須寫成MyClass.new { include MyModule } 若使用RSpec(v3.2)對Rails進行測試,不免俗要針對各種module進行unit test,尤其是helper、service object、或是各種model及controller當中的concern。不過問題來了,要如何在測試當中載入module?小弟一直以為方式是一樣的,但殊不知,在這裡也卡關許久。 rspec-rails這個gem library針對helper module有提供非常簡便的載入方法,我們的測試會寫成這樣: require 'rails_helper' RSpec.describe AppHelper, :type => :helper do # 測試內容 end 可以注意到:type => :helper這個敘述,等於直接載入了helper的內容,我們無需再另外考慮其他因素。 不過這裡有個陷阱,也就是並非所有module都可以這樣載入。如果我們有個service object檔案是greeter.

ruby on rails

RSpec-Rails當中自訂methods及helpers

在RSpec當中,常常會有些瑣碎的東西需要重複輸入,尤其是unit test,如果能夠包成helper methods,在不同檔案間重複利用,是再好不過的事情。以下提供兩個簡便的方法,可以撰寫專門給RSpec使用的methods,不會被Rails app本身觸發到。 1. 定義為Module 最快也最簡便的方法,就是在rails_helper.rb或spec_helper.rb裡面定義這些methods,這樣就不用在每一個RSpec檔案當中重新載入(畢竟每次都要require 'rails_helper'就已經夠煩了)。 例如要測試model之間的關係,我們會在測試當中這樣寫: require 'rails_helper' RSpe.describe User, :type => :model do it "has_many posts" do association = User.

ruby on rails

Rails複製資料庫內容:開發環境 -> 測試環境

進行Rails開發時,有時需要將開發環境(development)的資料庫內容複製到測試環境(test)當中,方便我們在整合測試時,有時需要撈取一些特定資料。我們這次要利用db:seed的方式,指定將資料seed到測試環境的資料庫當中。 分成三個步驟: 1. 開設一個專門的seed資料夾 2. 將目前的開發環境資料庫內容複製到seed檔案當中 3. 利用db:seed將資料倒入測試資料庫中 1. 開設專門的seed資料夾 由於會有許多測試檔案,因此我們不動到原本rails內建的db/seeds.rb,另外再開一個新的資料夾,放入所有我們需要的seed檔案。我們可以在db底下再增加一個資料夾seeds。整個結構變成: db |--> seeds |----> posts.rb |----> comments.rb 裡面所有的.rb檔案就是我們要產生的seed檔案。 2. 使用gem 'seed_dump' 來複製資料

ruby on rails

Rails 基本命名及關連

剛開始進入Rails,對於命名這件事情一定非常不習慣。之所以命名這麼重要,也是因為Ruby是物件導向的語言,而Rails更是把許多class、module、method都拆散在不同檔案中,方便管理。如果沒有將命名處理好,很容易不知道一個method是拿來做什麼用的。 以下說明幾個基本命名原則,讓新手可以更快掌握。 檔案命名與呼叫名稱 首先,檔案名稱都是小寫並加上底線(underscore): posts_controller.rb 但在呼叫這個class時,是用大寫,也就是CamelCase,跟駱駝的背部一樣有很明顯的高低起伏: PostsController 所以如果你在檔案名稱上看到大寫,最好趕快改成小寫並加上底線。資料庫的table名稱、column名稱也建議都是使用全小寫加上underscore的命名方式。 Model 首先,在command line中產生model,要使用單數。想像model是一個table的名稱,所以用單數來當做整體的概念。 $ rails generate model post 而在一般controller或其他地方呼叫

ruby on rails

Rails使用 include 和 join 避免 N+1 query

Rails當中要連結model之間的關係非常簡單,不過也因為由於建立關係是這樣的簡便,造成許多指令會在讀取資料庫時有記憶體的浪費。例如我們建立以下關係: # Post has_many :comments # Comment belongs_To :post 並在helper中寫下: Comment.each do |comment| comment.post.title end 如果我們有很多個comment,就會產生非常多的資料庫查詢記錄: 每一筆查詢對資料庫的效能都是一種消耗,因此身為後端開發者,查詢資料庫的次數是越少越好。以上寫法讓我們在查詢post的title時都透過comment的關連去查詢,所以執行每一個comment時,都會查詢一次post,增加大量的資料庫查詢比數。這就是一般資料庫容易產生的N+1 query問題,意思是我們在迴圈當中大量查詢N筆資料,再加上開頭查詢的那1筆,稱為N+1。 為了避免在幾千筆資料查詢時大量消耗不必要的記憶體,Rails提供joins和include方法可以在第一次查詢時將所有我們需要的資料一次查完。 記住

認識Rails ActiveRecord系列:文章導讀

剛開始學習Ruby on Rails時,不知你有沒有跟我一樣遇到幾個問題: 1. 為什麼在安裝Rails環境時需要使用『資料庫』這個玩意兒? 2. model儲存的資料在哪裡?怎麼專案資料夾都找不到? 3. db:migrate是什麼意思? 對我這種半路出家直接挑戰Rails的人來說,每次遇到『資料庫』這個用詞是一點頭緒都沒有。本系列就是簡單帶領各位讀者了解Rails與資料庫的關係,以及基本操作方法,由於本人並非本科系出生,因此會由幾個比較『世俗』一點的角度來說明資料庫的概念,希望大家都能夠有個初步認識。 1. 開始跟ActiveRecord當好朋友 1. Rails為何需要資料庫 2. Rails與資料庫如何進行連結 3. 操作及讀取資料庫的方法 2. Command Line基本操作指令 1. 如何從Command Line環境中操作Rails資料庫 2. 指令表 3. 新增、修改、刪除、重置資料庫 4. schema.rb及seed.rb檔案說明

ruby on rails

Rails當中的params是什麼?

我們常在Rails的controller中看到以下code: def show @post = Post.find(params[:id]) end 大家都知道一般的show action是要顯示單一項目的資料,但為什麼是params[:id]而不單純就是id或:id呢? 這邊先解釋一下http request:當使用者點擊連結的時候,會把一個http request送回伺服器,讓伺服器根據需求來將內容傳回瀏覽器。最簡單的例子就是我們輸入google.com時,傳送了一個http request給google的伺服器,他才將首頁內容回傳到瀏覽器上並顯示。 在Rails當中,http request會經過ActionController這個內建的機制來消化,並將可用的變數轉換為params這個變數,交由controller處理。底下會包含許多例如填寫表格的內容或其他變數,以hash的方式呈現: params = {:post => "Rails is Good", :content => "I love Ruby on Rails"

ruby on rails

Rails 基本 Helper 介紹

剛開始撰寫Rails時,假如你跟我一樣看不懂一個html.erb檔案裡面有非常多看不懂的東西,也不知道helper是什麼,那你找對地方了,本篇文章簡單說明基本的helper概念,讓你看得懂helper在幹嘛。 Helper是什麼 Helper是一種輔助方法,目的是將Ruby code帶入view當中,而不是單純的平舖直敘。這點也是Rails分工的一環,model和controller的method不能在view當中直接使用,只有helper method才行。 Helper和Helper method差在哪裡? Helper是一個概念,而在Rails架構中helper自己有一個資料夾,我們可以在裡面定義helper method,定義完以後就可以在view當中使用。Rails當中有提供很多內建的helper,只要是.erb結尾的檔案,都可以使用helper,包括html.erb、js.erb等等。 當然,helper這個詞並不會使用於controller和model當中。 <% %>和<%= %> 複習一下,在.erb結尾的檔案當中,可以利用<% %>符號將R

ruby on rails

ActiveRecord Migration撰寫方法

開啟rails專案以後,常常會需要對資料庫進行更動,這時就必須依靠Migration的協助。啥?你說為什麼不直接用GUI介面操作資料庫嗎?等有20個以上的table,再這樣做也不遲。本篇列出在撰寫migration檔案時會用到的指令。 Method列表 針對table編修 create_table :table_name do |t| t.type :column_name # 例如 t.integer post_id end drop_table :table_name rename_table :old_table_name, :new_table_name change_table :table_name do |t| t.action :column_name # 例如 t.

ruby on rails

ActiveRecord Migration 初級演練

在看完先前幾篇有關ActiveRecord的解說,本篇進行一次實際操作,調整資料庫並觀看實際結果。 開啟新專案 $ rails new activerecord 建立model及資料 首先產生model檔案,開始進行資料庫管理: $ rails g model post title:string content:text 接著我們可以使用rails console來查看資料庫內容。如果你有sequel pro之類的GUI,也可以在裡面進行查看。不過因為我們都是初學,可以多操作練習rails console的使用方法。 $ rails c $ Post.inspect (在console中model的名稱第一個字母要大寫) 這時我們會發現有個Table doesn't exist的錯誤,因為我們只在Rails專案中產生檔案,卻沒有移植到資料庫中,所以這時需要先執行: $ rake db:migrate 接著再回Rails console,重複執行上述方法,就可以看到: 以上是我們在產生model檔案時指定他為我們產生的資料庫內容,看起來無誤! 接

ruby on rails

開始跟Rails ActiveRecord當好朋友

開啟新的Rails專案以後,第一步就是要資料庫操作開始,也就是產生model檔案。(啥?你不需要用資料庫?那用Rails幹嘛?)本篇簡單說明Rails當中基本的資料庫概念。 1. 為什麼Rails需要使用資料庫? 假如今天我們要儲存部落格所有的post,用.html或.rb檔案來儲存在專案資料夾中,未來這些所有post還要依照開發者的需求來查閱、排序、修改,如果都用文字搜尋的方法來查找,是極其沒有效率的。 因此我們需要一個專門管理資料的系統,讓我們方便對所有資料進行操作,資料庫裡面是各種表格,就像一堆excel的表格一樣,有了這樣的架構,要查找就方便多了! 如果你真的對資料庫一點概念都沒有,建議可以在下方延伸閱讀或是Wiki、Google上大概了解資料庫的意義及目的。 2. Rails的資料庫在哪? 首先要先知道幾件事情: 1. Rails專案資料夾內並不會有『資料庫』這個東西(sqlite除外)。 2. 如果在安裝Rails過程中有安裝過sqlite和mysql,這些套件會去連接系統的資料庫。 3. Rails操作資料庫的套件稱為ActiveRecord

ruby on rails

ActiveRecord Command Line基本操作指令

Commaned Line常用指令列表 在Rails資料夾底下,執行以下指令,就可以針對資料庫有不同操作,記得前面要加上rake: * db:create 在目前環境當中產生一個空白的資料庫 * db:create:all 在所有環境當中產生空白資料庫 * db:drop 刪除目前環境的資料庫 * db:drop:all 刪除所有環境的資料庫 * db:migrate 依照未執行過的migration檔案更新資料庫 * db:migrate:up依照未執行過的migration,執行一次migration更新資料庫 * db:migrate:down 依照已執行過的migration,退回一次migration * db:migrate:status 顯示目前migration到哪個地步 * db:rollback 退回一次migration * db:forward 更新一次schema檔案 * db:seed 執行 seed.rb 檔案 * db:schema:

ruby on rails

Debugging Rails入門:五個必備技巧

從第一天學寫code開始,bug就隨之而來。就算只是不小心把true打錯成truee,程式也會很無情的賞你一個大大的錯誤訊息。在學Rails的路上我們都不孤單,不是因為有很棒的Rails社群,而是因為每天都有新的bug相伴左右。 我開發Rails的時間不長,但在一路跌跌撞撞之下,碰過的bug也實在不少。在這邊彙整一些前人的經驗及自身的學習,提供幾個有用的技巧、技巧,希望新手都能快速了解遇到bug時該用什麼樣的方法來應對。 以下分為五篇文章: 第1篇:看懂錯誤訊息 遇到bug,第一件事就是要把訊息看清楚!本篇以非常入門的角度介紹在irb以及Rails當中遇到錯誤時,畫面中的訊息分為哪些區塊,以及該如何解讀。 第2篇:九個常見的錯誤訊息 看懂錯誤訊息以後,如果能自己快速處理掉,那真是再好不過。本篇介紹九個常見的錯誤訊息,分享一些常見狀況,看到底有哪些狀況可以直接照邏輯判斷錯誤的地方。 第3篇:遇到bug直接在瀏覽器除錯 一般來說,遇到bug都是回到code當中瀏覽、思考,但更直接的方法是在遇到bug時直接從瀏覽器的當下狀況直接進行分析。儘管從Rails 4.2.0開始

Debugging Rails:前端後端到底哪裡出錯?用DevTools來檢視整個流程

數值回傳到前端就是錯!到底是前端的問題還是後端的問題? 通常Rails都會配合複雜的前端框架,例如Ember.js或Angular.js,彼此之間用ajax和json來溝通。在前後端越長越複雜的時候,這種癥結點就會出現了。最好是能先抓出是哪邊的問題,這樣debug才能精確!如果後端工程師debug一整天,結果發現錯是在前端...這... 不過這樣的情況,可以依靠瀏覽器內建的除錯工具,可以幫助我們判斷前後端送資料的詳細內容,可以用這個地方來判斷到底是哪個環節出錯。 1. 如果在發送ajax request的時候就已經有問題,那問題就在前端。 2. 如果是從後端回傳的數值有問題,那問題就在後端。 例如有一個全台灣50歲人口平均收入計算程式,要從資料庫抓出所有人的收入並計算平均。前端傳送一個ajax request到後端資料庫去查詢所有50歲人口的收入,假如送出去的資料是40歲而非50歲,那後端再怎麼精準,傳回前端的數值一定是錯的。反之,如果送出的數值是正確無誤的,那就可以合理懷疑在資料庫進行query時是否有什麼問題? 1. 使用Chrome DevTools 身為