從項目推進、上線,到後期的撰寫教程,我們可以說是「J & A 兩人同心,其利斷金」,合力完成了很多事情,過程非常流暢。這樣的協作默契,與其說是來自兩人本身就很合拍(總不能歸因於我們都是台灣同鄉!),不如說是因為「行動力」;意識到任何項目需求,就立即提出,兩人主動安排自己可以負責的任務、分頭執行,並互相照應。
像是 5/21 上線當天:
吉米:快手快腳地幫第一版作品進行功能和頁面的收尾、修正(神隊友簡直在閃閃發亮啊!),寫 Logdown 簽名檔用的 HTML,幫網站截圖、準備 JD Store 大賽作品頁面會用到的截圖和敘述。
① 終端機執行 $ rails g controller products 後,在 app/controllers/products_controller.rb 中加入 index 的 action,
② config/routes.rb 中用 get "/products/index" => "products#index" 設置路徑。
③ 在 app/views/products 裡新增 index.html.erb,就可以動手作一個簡單的靜態頁面了。
作品好看,或是有產出前端相關的教程,自然會吸引一些同學來問問題;或是逛逛交流論壇、Slack、參加 Global Team 的線上 Meetup,主動尋找問題。當面對同學問問題,比起提供大致方向,我會傾向「利用問題,再作一次練習」;把被問及的每一個「問題」當作機不可失的「練習機會」。
例如 Max 之前傳來他想要的商品列表的樣式,說在實作前端頁面時遇到問題,我便利用 Gist 寫了一個簡單的架構給他、附帶註解說明。練習、實作時,人往往會不自覺選擇自己熟悉的佈局、樣式。因為如此,來自其他同學的問題,成了寶貴的「練習題」;把握每一次機會,分析問題、思考解決方案,讓自己充分調動技能,並檢查自己有無知識盲點。
Q. 老師當年為什麼要學 Ruby on Rails?
A. PHP 作項目太慢了,Rails 可以快速開發、有很棒的現成套件,學習起來很有成就感,也會有更多的時間用來學習其他新的事物。
Q. 不理解代碼原理,不懂為什麼要這樣寫;對代碼的觀念還是很模糊。
A. 多練個幾遍。另外就是,你們都犯了「不敢改」的毛病!要改裡面的動作,改壞它!修壞掉的東西,你就知道背後的原理了。
Q. 找不到問題的解答,覺得很疲憊。
A. 找不到解答當然會很疲憊,這是常態!但要積極去找出「問題的邊界跟原因」,然後寫成教程,加快自己下一次實作的速度。 編程之所以會讓人痛苦,是因為沒有標準答案,只有「接近標準答案的答案」;有時候你找得到,有時候你找不到,這都是正常的。如果你感到痛苦,表示你正在成長,這就是「成長痛」!
Q. 與隊友協作、溝通時,理念有衝突,有很多讓步與妥協。哪些是我們該堅持?哪些是我們該妥協的?
A. 試著再作一個產品,堅持你原先的理念,然後看會不會成功。當時不作了,未來也不作了。不是這樣的!就算讓步、決定採用對方的點子,事後還是要去實現自己的點子,才能驗證自己的想法對不對。如果成功了,就能打對方臉;就算失敗了,也是很好的學習。
Q. 有沒有官方寫的功能實作教程?
A. 教程有一些東西不寫,是希望你自己 Google 寫出來!你要自己有「求知慾」,如果你老是等別人的答案,你在編程的世界是會死的。不管教程再完整、詳細,都不可能 100% 滿足你的需求。你自己本身要有「好奇心」,才是好的學習節奏;你不可能永遠都在等別人給你完美的教程,你如果不行動,就不會成長。
因此,與其用「因為他之前就是作程序員」、「因為他是全職在學習,有大把時間」、「他資質好、天賦高」這些方便的理由來解釋學霸的作品,不如認清自己跟學霸差就差在「勤奮」二字(就算真的有其他條件上的差異好了,這邊引用笑來老師一句,「難道起點比別人低,你就不成長了嗎?」),趕緊打開 Atom 跟終端機開始敲代碼,投入時間跟心力持續迭代吧!
就如同先前分享過的「切換多語系」功能,這次新添加的「依照工作地點自動生成、顯示 Google Map」依然不是一個 MUST HAVE 功能,但覺得 Google 等大公司的職缺信息都有放一張小地圖,實在太帥了,所以還是硬耗了一天時間折騰。這篇文章濃縮了實裝方式,讓大家少走點冤枉路。如果覺得這篇教程有用,又或是你願意鼓勵支持,歡迎至:我的作品頁面 點下「支持TA」。
本篇分享以 Job Listing 教程的代碼作示範,為了節省篇幅,只在 admin/jobs 中添加 Google Map 相關的修改。如果你要在其他頁面顯示,可以照著步驟依樣畫葫蘆。
點擊「取得金鑰」後,會跳出一個彈跳視窗。把「Select or create project」的選單點開,選擇選單最下方的「Create a new project」後,原本壓灰無法點擊的「ENABLE API」會變成「CREATE AND ENABLE API」,果斷點擊!
等待一下下,看到這個畫面就萬事 OK 了。「YOUR API KEY」欄位的那一串就是你的「金鑰」,可以先記著等下使用。
Step 5. 顯示 Google Map!
首先,我們要修改 jobs_controller.rb,在 def show 中加入生成地圖的相關代碼(新手如我們就先不追究代碼細節,只要知道代碼的功用是拿 Job 的 latitude 和 longitude 的經緯度資料產生地圖就好 )。
app/controllers/admin/jobs_controller.rb
defshow@job=Job.find(params[:id])# 使用經緯度兩個欄位的數值,建立 Google Map
@hash=Gmaps4rails.build_markers(@job)do|job,marker|marker.latjob.latitudemarker.lngjob.longitudeendend
在 views 中加入以下代碼,「Google Map API 金鑰」這時候就要用上了!請務必記得用剛剛申請的金鑰替換代碼中的「你的API金鑰」。
app/views/admin/jobs/show.html.erb
<!-- 測試用,顯示工作地點資訊 --><p>緯度:<%= @job.latitude %></p><p>經度:<%= @job.longitude %></p><p>地址:<%= @job.address %></p><!-- 顯示 Google Map --><divid="map"></div><!-- Google Map 相關代碼 --><!-- 請先取得 Google Map API Key(API 金鑰),並用取得的 API 金鑰取代「你的API金鑰」--><script src="//maps.google.com/maps/api/js?key=「你的API金鑰」"></script><script src="//cdn.rawgit.com/mahnunchik/markerclustererplus/master/dist/markerclusterer.min.js"></script><script type="text/javascript">handler=Gmaps.build('Google');handler.buildMap({provider:{},internal:{id:'map'}},function(){markers=handler.addMarkers(<%=raw@hash.to_json%>);handler.bounds.extendWith(markers);handler.fitMapToBounds();});</script>
另外,有注意到剛剛貼的代碼中有一行 <div id="map"></div> 嗎?我們還需要到 application.scss 檔設定一下 map 這個 ID 的 CSS 屬性,這一步不單單只是為了頁面的排版,也是為了畫出一個範圍顯示 Google Map (像是準備一塊畫布用來繪製 Google Map);如果沒有設定 width 和 height,就無法顯示唷!
app/assets/stylesheets/application.scss
// Google Map
#map{width:80%;//寬,必須要有!
height:250px;//高,必須要有!
margin:40px;margin-left:auto;margin-right:auto;}
以上步驟作完後,回到網頁重整一下,依照該筆工作的「地址」資料生成的 Google Map 就出來了!
Step 6. 解決「使用者必須要刷新頁面,地圖才會顯示」問題
別高興得太早,在測試後,我們發現一個大問題:「使用者必須要刷新頁面,地圖才會顯示」。
把幾個關鍵字「rails google maps load issue」丟給 Google 大神求援時,發現早已有多名 Rails 開發者哀嚎過了。長話短說,之所以會有這個問題,是因為 Rails 的 Turbolinks 造成(欲知詳情,請見:Pros and Cons of Turbolinks in Rails 4 Applications。)。最簡單、暴力的方式就是到 applicaton.js 中把 //=require turnolinks 這一行給刪了。
app/assets/javascripts/application.js
刪除後,就能解決「使用者必須要刷新頁面,地圖才會顯示」問題。點開職缺,就可以看到 Google Map 顯示了。大功告成!