Gemfile
gem 'gon'
application.html.erb
<%= include_gon %>
pages_controller.rb
def index
gon.db = Page.all
...
回到console
bundle install
rails s
in AWS
RAILS_ENV=production bundle install
則可以在index頁面的Console中輸入gon.db 會得到Objects array
references
[1]Passing data to Javascript
2016年7月8日 星期五
2016年3月30日 星期三
2016年3月27日 星期日
[rails]HOW TO: 將txt格式資料匯入資料庫的頁面
參 考https://richonrails.com/articles/importing-csv-files
index.html.erb
說明:
我們想要在records底下新建一個頁面([project path]/records/import/),在這個頁面使用者可以選擇想要上傳的local端檔案,然後按下import按鈕匯入資料。
首先是要處理當使用者輸入網址/import/時,由show action 處理,並 render import.html.erb
app/controller/records_controller.rb
def show
if valid_page?
render params[:id]
else
render file:"public/404.html", status: :not_found
end
end
在指定的頁面 (在這裡是import.html.erb)中加入可以上傳檔案的html
<h1>import csv file</h1>
<%= form_tag import_records_path, multipart: true do %>
<%= file_field_tag :file %>
<%= submit_tag "Import CSV" %>
<% end %>
目前為止rails 還不知道import_records_path會回傳什麼path,所以需要在config/routes中定義:
resources :records do
collection{post:import}
end
接下來當在index.html.erb頁面,使用者選擇本機端的特定檔案後,按下Import CSV 按扭,router會導引到records/import/ 這個path(並將特定 檔案的path存到變數:file),而當rails接收到records/import這個path ,會去執行records controller底下的#import action。
於是我們要定義import action. edit app/controller/record_controller.rb
def import
Record.import(params[:file])
end
我們希望使用import這個method來將資料匯入,目前為止還沒有定義這個method,而這個method是Record Object底下的方法,所以我們接下來要定義他
app/models/record.rb
require 'csv'
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
record_hash = row.to_hash #把csv檔的以列(row)為單位pop-out
record = Record.where(id: record_hash["id"])
if record.count == 1
record.first.update_attributes(record_hash)
else
Record.create!(record_hash)
end # end if !record.nil?
end # end CSV.foreach
end # end self.import(file)
這段程式會把csv檔的第一行作為index,存到record_hash這個變數中,找到指定的欄位
當原始資料庫中沒有值時,會初始之,若已經有資料了,就加上去。
example.csv
program_id,distance,property_id,minutes,seconds,user_id,owner_id,month,date,year
1,1,1,2,2,1,1,3,22,2016
1,1,1,2,2,1,1,3,22,2015
1,1,1,2,2,1,1,3,22,2014
說明:
我們想要在records底下新建一個頁面([project path]/records/import/),在這個頁面使用者可以選擇想要上傳的local端檔案,然後按下import按鈕匯入資料。
首先是要處理當使用者輸入網址/import/時,由show action 處理,並 render import.html.erb
app/controller/records_controller.rb
def show
if valid_page?
render params[:id]
else
render file:"public/404.html", status: :not_found
end
end
在指定的頁面 (在這裡是import.html.erb)中加入可以上傳檔案的html
<h1>import csv file</h1>
<%= form_tag import_records_path, multipart: true do %>
<%= file_field_tag :file %>
<%= submit_tag "Import CSV" %>
<% end %>
目前為止rails 還不知道import_records_path會回傳什麼path,所以需要在config/routes中定義:
resources :records do
collection{post:import}
end
接下來當在index.html.erb頁面,使用者選擇本機端的特定檔案後,按下Import CSV 按扭,router會導引到records/import/ 這個path(並將特定 檔案的path存到變數:file),而當rails接收到records/import這個path ,會去執行records controller底下的#import action。
於是我們要定義import action. edit app/controller/record_controller.rb
def import
Record.import(params[:file])
end
我們希望使用import這個method來將資料匯入,目前為止還沒有定義這個method,而這個method是Record Object底下的方法,所以我們接下來要定義他
app/models/record.rb
require 'csv'
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
record_hash = row.to_hash #把csv檔的以列(row)為單位pop-out
record = Record.where(id: record_hash["id"])
if record.count == 1
record.first.update_attributes(record_hash)
else
Record.create!(record_hash)
end # end if !record.nil?
end # end CSV.foreach
end # end self.import(file)
這段程式會把csv檔的第一行作為index,存到record_hash這個變數中,找到指定的欄位
當原始資料庫中沒有值時,會初始之,若已經有資料了,就加上去。
example.csv
program_id,distance,property_id,minutes,seconds,user_id,owner_id,month,date,year
1,1,1,2,2,1,1,3,22,2016
1,1,1,2,2,1,1,3,22,2015
1,1,1,2,2,1,1,3,22,2014
圖一:加入上傳資料功能後的頁面
圖二:選擇檔案後,會在頁面上顯示路徑
圖三:資料成功加入資料庫
延伸應用:可應用於使用者上傳檔案,運算後輸出
2016年3月23日 星期三
Growth School 的Rails 商務網站X即戰力班 學習心得
由XDite辦的rails 商務網站X即戰力班,趁著記憶猶新好好的整理一下心得分享。
以往曾經嘗試自學過php, python+django架構,但是結果總是在完成一個最陽春功能後開始撞牆(開始嘗試約二、三個月),然後開始fade out,轉頭嘗試其他的東西。也許部份的原因是注意力不集中症後群(!?),最重要的原因也是因為沒有成就感,覺得要完成一個簡單的作品就這麼難,何況是自己腦海中刻劃的那有點複雜的作品原型呢?人的本能反應就是轉頭嘗試其他解法。
仔細想了其中的原因是什麼,一是不熟悉這種自己找答案自學的方式,網路上接收到的資訊太雜亂了,有時根本不知道問題在哪邊,以try and error方式花費了不少時間,要解決一個問題可能是以小時為單位的。二是不知道怎麼問問題,所以問題很容易一直發散。這堂課的規劃幾乎沒有讓人有以前不停撞牆的感受。
也許這堂課就是教我們不要一直想問為什麼、為什麼、為什麼,先背起來、先做起來,然後自己就會懂了。這時不禁想到以前補習班老師的座右銘:為什麼我會,因為我有背!此言不假。
如果說rails學習曲線當成是一條極度抖上的山坡,那我覺得這堂課很像是在旁邊打下的一階階樓梯。路還是一樣陡,但是至少我們可以一階一階知道自己在哪,而當自己覺得好像有點迷路的時候,只要舉手、發問就可以被引導回路徑,繼續這條陡上的路。
這門課幫助我哪些
時間、時間、時間
至少可以說出這門課三個節省時間的模式,還有因為感受很深所以說三次。- 提出問題到解決的時間 : hours -> minutes
- 完成一個夠水準作品的時間:months -> weeks
- 達到知道怎麼發問,問什麼問題會得到解答的能力:months ->weeks
以往曾經嘗試自學過php, python+django架構,但是結果總是在完成一個最陽春功能後開始撞牆(開始嘗試約二、三個月),然後開始fade out,轉頭嘗試其他的東西。也許部份的原因是注意力不集中症後群(!?),最重要的原因也是因為沒有成就感,覺得要完成一個簡單的作品就這麼難,何況是自己腦海中刻劃的那有點複雜的作品原型呢?人的本能反應就是轉頭嘗試其他解法。
仔細想了其中的原因是什麼,一是不熟悉這種自己找答案自學的方式,網路上接收到的資訊太雜亂了,有時根本不知道問題在哪邊,以try and error方式花費了不少時間,要解決一個問題可能是以小時為單位的。二是不知道怎麼問問題,所以問題很容易一直發散。這堂課的規劃幾乎沒有讓人有以前不停撞牆的感受。
有如工具書般的教材
可讀性很高,極少有看了但不知道要加在哪的程式碼,這點很細節不容易被注意,但是非常重要。而且只要照著步驟去做,一定可以完成。自己遇到一半以上的問題,幾乎都不是教材的錯誤,而是來自於自己少做了其中哪幾個步驟。曾經嘗試寫過教學文件的人都知道要寫一個"讓九成以上的人照作就可以得到成功的結果"的教材有多麼的困難,顯示得出這份教材是非常用心在撰寫的。經驗傳承
講師XDite傳授了許多心法,舉凡開發產品時會用到的技巧,開發者常遇到的問題QA,如果說怎麼寫rails網站是招式,那這些技巧、經驗就是內功了,這些經驗往往是經過大大小小專案才洗鍊而成的心法在這堂課也一併傳授,很受用。
此外這堂課也有非常強大的助教群,人數上也很足夠。每當實作上有任何問題的時候,助教也可以馬上協助。甚至我覺得助教在課堂上的跑步速度可能每經過一季課程都有在被檢討進步的(!?)雖然這樣說有點誇張,但總結來說我覺得是一門有用心經營的課程。(感謝強大的助教群,以極快的速度回應協助我們)
上這門課遇到的難題
ruby的文法
rails是用ruby寫的網頁框架,在語言特性的熟悉上也遇到一點點的麻煩。有寫過python的人可能也會跟我類似的經驗(因為python的文法限制較多,連空格都有嚴格規定),在讀rails的code時,會對於許多文法感到疑惑。因為rails有許多省略的寫法,但是功能、目的是一樣的,比如說引用一個函式 adder(a,b),也可以寫作adder a,b,這兩個是等效的。讀code時最常遇到在這種等效的statement上困惑的,而這種問題對我來說最不好線上發問,因為不知道怎麼問。只有當助教在的時候直接指著句子問才恍然大悟。意謂著在這個問題上會分心。也許在上這門課前的準備工作可以先準備這方面的背景知識
rails 專屬的潛規則!
在上這門課以前,聽說rails 的學習曲線很抖,但是無法體會,但是在上了這幾次課,寫了許許多多的課程、作業時終於有所體認,因為rails有好多的潛規則(或稱rails的黑魔法)需要去理解、背誦。但也因為這些黑魔法,讓rails這個框架非常的強大,因為他在背後做了非常多的事,而因為我們不知道rails有多自動與強大,因為不知道為什麼,所以學習的時候會恐慌。也許這堂課就是教我們不要一直想問為什麼、為什麼、為什麼,先背起來、先做起來,然後自己就會懂了。這時不禁想到以前補習班老師的座右銘:為什麼我會,因為我有背!此言不假。
如果說rails學習曲線當成是一條極度抖上的山坡,那我覺得這堂課很像是在旁邊打下的一階階樓梯。路還是一樣陡,但是至少我們可以一階一階知道自己在哪,而當自己覺得好像有點迷路的時候,只要舉手、發問就可以被引導回路徑,繼續這條陡上的路。
什麼人我覺得推荐來上這門課
腦中有想法,但是不知道怎麼實現的人
如果前面所說的這門課會節省你非常多的時間,先求有再求好,這堂課可以大大的縮減"先求有"的時間。Rails本身讓網站功能的開發大幅減少,而Rails 商務網站即戰力班則是幫助度過Rails前期學習曲線很抖的階段。
2016年3月15日 星期二
使用rails產生靜態網頁(三):用變數來統一處理大量不一樣的分頁
這一回我們要解決當特定的template不存在時,產生的error。
處理的機制就是在controller中,判 斷params[:single_page]這個內含分頁名稱的變數,是否有對應的template存在,如果有,則render該template,若否,則統一導向一個指示網址錯誤的提醒網頁。
controller改寫為
class PagesController < ApplicationController
def show if valid_page?
render template: "pages/#{params[:single_page]}"
else render file: "public/404.html", status: :not_found end end private
def valid_page?
File.exist?(Pathname.new(Rails.root + "app/views/pages/#{params[:single_page]}.html.erb")) end
end
值得一提的是,ruby要完成一件事有許多種作法,在這裡render template的方式是
render template:"page#{params[:single_page]}" 將path作為值傳給template這個變數,另外還有一個作法是
render params[:single_page] 這樣也可以達到一樣的作法喔,而且看起來乾淨多了。
處理的機制就是在controller中,判 斷params[:single_page]這個內含分頁名稱的變數,是否有對應的template存在,如果有,則render該template,若否,則統一導向一個指示網址錯誤的提醒網頁。
controller改寫為
class PagesController < ApplicationController
def show if valid_page?
render template: "pages/#{params[:single_page]}"
else render file: "public/404.html", status: :not_found end end private
def valid_page?
File.exist?(Pathname.new(Rails.root + "app/views/pages/#{params[:single_page]}.html.erb")) end
end
值得一提的是,ruby要完成一件事有許多種作法,在這裡render template的方式是
render template:"page#{params[:single_page]}" 將path作為值傳給template這個變數,另外還有一個作法是
render params[:single_page] 這樣也可以達到一樣的作法喔,而且看起來乾淨多了。
使用rails產生靜態網頁(二)
在上一回中,我們產生了一頁靜態網頁,現在我們要繼續產生更多筆的靜態網頁。
我們產生一個靜態網頁常常產生的分頁:about page, contact page
首先是跟router說明在接收到不同網址的要求時,應該怎麼辦。在config/routes.rb 中加入兩行
再來就是設定Controller, 以及 View這二位一體的部分了。
(原本是三位一體,但是靜態網頁沒有model的部份)
a)Controller
app/controllers/pages_controller.rb 加入contact, about action的定義
b)View
<h1>about</h1>
這樣我們就有多筆靜態網頁了!但是應該有更省力的方式…
我們產生一個靜態網頁常常產生的分頁:about page, contact page
首先是跟router說明在接收到不同網址的要求時,應該怎麼辦。在config/routes.rb 中加入兩行
get "/pages/about" =>; "pages#about"get "/pages/contact" =>; "pages#contact"
意思是當 瀏 覽器輸入 localhost:3000/pages/about/ 以及localhost:3000/pages/contact/時會分別對應到 pages Controller底下的about, 以及 contact action
再來就是設定Controller, 以及 View這二位一體的部分了。
(原本是三位一體,但是靜態網頁沒有model的部份)
a)Controller
app/controllers/pages_controller.rb 加入contact, about action的定義
def contactenddef aboutend
b)View
app/views/pages/contact.html.erb 編輯contact 靜態網頁模板
<h1>contact</h1>
app/views/pages/about.html.erb 編輯about 靜態網頁模板
<h1>contact</h1>
app/views/pages/about.html.erb 編輯about 靜態網頁模板
<h1>about</h1>
這樣我們就有多筆靜態網頁了!但是應該有更省力的方式…
2016年3月14日 星期一
使用rails 產生靜態網頁(一)
keywords: static website
"在學習rails之前,我會javascript, css, html等 靜態網頁,而學習rails之後,我知道怎麼使用rails快速的開發一個網站,但是反而不知道該如何利用rails完成一個再簡單不過的靜態網站…"
如果您有這樣的想法,那這一篇文章就是逐步的解說如何使用rails建立一個簡單的靜態網頁。rails是個功能強大的框架,但是有時候我們想要做的反而是一個簡單的功能。對於從靜態網 頁開發者跨入 "網站"開發領域的開發者而言,也許會有困擾是如何使用這一個功能強大的工具,來完成自己之前熟悉的功能
"在學習rails之前,我會javascript, css, html等 靜態網頁,而學習rails之後,我知道怎麼使用rails快速的開發一個網站,但是反而不知道該如何利用rails完成一個再簡單不過的靜態網站…"
如果您有這樣的想法,那這一篇文章就是逐步的解說如何使用rails建立一個簡單的靜態網頁。rails是個功能強大的框架,但是有時候我們想要做的反而是一個簡單的功能。對於從靜態網 頁開發者跨入 "網站"開發領域的開發者而言,也許會有困擾是如何使用這一個功能強大的工具,來完成自己之前熟悉的功能
2016年2月29日 星期一
2016年2月26日 星期五
[rails]將新的欄位加入model
rails generate migration add_[column]_to_[model name] [column]:[type]
rails generate migration add_title_to_groups title:string
rails generate migration add_description_to_groups description:text
rails generate migration add_title_to_groups title:string
rails generate migration add_description_to_groups description:text
訂閱:
文章 (Atom)




