Grails: GORM 自動更新儲存問題

Grails 版本: 2.3.5

以下面的程式碼為例,

我們希望找到 author 之後,將 author 存回 book 中,

再呼叫 book 做 save(),

但實測發現 book 在 if 之前就已自動儲存,

book update
1
2
3
4
5
6
7
8
9
def book = Book.get(params.id)
book.properties = params

def author = Author.findByName(params["author.name"])

if(author){
  book.author = author
  book.save()
}

查了一下 Grails API 找到 discard() 方法,用來避免自動執行儲存

測試的程式碼如下,結果 book 仍然自動更新 (暈) ,

book update - test discard
1
2
3
4
5
6
def book = Book.get(params.id)
book.properties = params

def author = Author.findByName(params["author.name"])

book.discard()

繼續 try 不同的組合後發現似乎是 findBy() 指令造成 book 自動儲存

在此提供兩種解決方式,第一種是在 mapping params 之前先執行完 findBy()

book update - solution 1
1
2
3
4
5
6
7
8
9
def author = Author.findByName(params["author.name"])

def book = Book.get(params.id)
book.properties = params

if(author){
  book.author = author
  book.save()
}

若因為處理邏輯的因素 findBy() 一定得在 book.properties = params 之後,

我們可以用第二種方式,使用 new Book(params) 來取代 book.properties = params

book update - solution 2
1
2
3
4
5
6
7
8
9
10
def book = new Book(params)

def author = Author.findByName(params["author.name"])

if(author){
  def book = Book.get(params.id)
  book.properties = params
  book.author = author
  book.save()
}

Grails + iReport: PDF 繁體中文無法顯示解決方法

Grails 版本: 2.3.5

iReport 版本: 5.5.1

iReport 在產生 PDF 檔一直都有中文顯示異常的問題,

此次要記錄的是在 Grails 中的解決辦法,

首先在 iReport 中將顯示中文的欄位屬性設定如下,

Pdf Font name is now deprecated. –> MSung-Light

Pdf Embedded –>勾選

Pdf Enconding –> UniCNS-UCS2-H(Chinese traditional)

iReport Field Properties

再到 iReport 安裝路徑中複製出 iTextAsian.jar ,

夏天安裝在 mac 中路徑如下,找不到的話應該可以從網路上下載。

/Applications/Jaspersoft iReport Designer.app/Contents/Resources/ireport/ireport/libs

iTextAsian @iReport

接著將檔案丟到 Grails Project 中的 lib 資料夾下

iTextAsian @Grails

這樣輸出的 PDF 就可以顯示中文摟~ :)

Test

Javascript Array SyntaxMDN Documentation
1
2
var arr1 = new Array(arrayLength);
var arr2 = new Array(element0, element1, ..., elementN);
Time to be Awesome - awesome.rb
1
puts "Awesome!" unless lame
Time to be Awesome - code_block.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Float
  def number_decimal_places
    self.to_s.length-2
  end
  def to_fraction
    higher = 10**self.number_decimal_places
    lower = self*higher
    gcden = greatest_common_divisor(higher, lower)

    return (lower/gcden).round, (higher/gcden).round
  end

private
  def greatest_common_divisor(a, b)
     while a%b != 0
       a,b = b.round,(a%b).round
     end
     return b
  end
end

使用 Octopress 部落格發佈文章

1. Octopress Blog 基本設定

在 Octopress 資料夾中可以找到一個 _config.yml 的檔案,

是用來設定部落格產生時讀取的預設資料,可以分為以下幾個部分:

基本預設資料:   
url: http://summerlize.github.io            #部落格網址
title: 這個夏天。                             #部落格標題
subtitle: 小小筆記本                          #部落格副標題
author: SUMMERLIZE                          #作者名稱
simple_search: http://google.com/search     #搜尋引擎
description: 我是一個部落格                   #部落格描述
date_format: "ordinal"                      #日期格式*
subscribe_rss: /atom.xml                    #RSS服務
subscribe_email: summerlize@gmail.com       #Email
category_feeds: false                       #訂閱指定分類文章 預設為否
email: summerlize@gmail.com                 #在RSS中列出Email   

有做過功課大多會發現 Octopress 是利用 Jekyll 產生出靜態網頁的,

如果沒有特殊需求,採用預設值即可。

Jekyll靜態網頁產生器與附加元件設定:

#直接部署的octopress專案通常不需要修改root,除非有另外包資料夾,
#最簡單的方式是觀察網址,假如首頁為http://summerlize.github.io/project,那麼root便是/project

root: /

#此處為部落格文章的預設路徑,預設為/blog/年/月/日/文章標題

permalink: /blog/:year/:month/:day/:title/

#原始碼資料路徑,預設為source,同上面的例子則為/project/source

source: source

#預設編譯的資料夾路徑,預設為public,同上面的例子則為/project/public

destination: public

#預設附加元件路徑,預設為plugins,同上面的例子則為/project/plugins

plugins: plugins

code_dir: downloads/code

#編譯後的部落格分類路徑
category_dir: blog/categories


markdown: rdiscount
rdiscount:
    extensions:
        - autolink
        - footnotes
        - smart

pygments: false # default python pygments have been replaced by pygments.rb

paginate: 10          #首頁顯示的文章數

pagination_dir: blog  #Directory base for pagination URLs eg. /blog/page/2/

recent_posts: 5       #最近發表的文章顯示篇數

excerpt_link: "Read on →"  #文章末處提示繼續閱讀全文連結字樣

titlecase: true       # Converts page and post titles to titlecase

#側邊列表顯示的內容,預設為最近發表文章、github、delicious、pinboard、googleplus等。

default_asides: [asides/recent_posts.html, asides/github.html, asides/delicious.html, asides/pinboard.html, asides/googleplus.html]

按讚或分享部落格

官方內建的第三方服務包含了幾個知名社群類型網站,

像是 Twitter 、 Google+ 、 Facebook 等,另外也有 Google 統計分析工具等擴充。

第三方服務設定(社群服務等):
github_user:                    #輸入GitHub帳號便會自動生成按鈕連結,其他以此類推。
github_repo_count: 0            #輸入GitHub Repo數
github_show_profile_link: true #顯示GitHub檔案連結,預設開啟。

COMMENTS功能

其中 disqus 的設定,是用來提供訪客留言的功能,大推~

Disqus官方網站 申請帳號後設定即可。

2. Octopress Blog 新增/發佈文章

終於進入正題囉~首先使用 rake -T 可以查看 Octopress 的所有指令,

新增文章使用 rake new_post["title"],在 title 處輸入文章標題即可,

有趣的是如果輸入的是中文,Octopress 會自動轉換成羅馬拼音的檔名,

因此建議還是輸入有意義的英文標題,撰寫文章時再改成中文標題摟~

產生的文章會在 octopress/source/_post/ 底下,

找到剛才新增的檔案後用文字編輯器打開,

就可以開始使用 Markdown 編輯文章了。 下載好用的 Markdown 編輯器 Mou

編輯完成之後,以 rake generate 產生靜態部落格網頁,

再以 rake deploy 發佈就可以在網址中檢視了。

ps. 目前使用 GitHub 的經驗,第一次會很快,第二次之後大概需要 10 到 20 分鐘不等才會更新。

在發佈新文章之前,也可以使用 rake preview 來預覽你的部落格,

預設的預覽網址為 http://localhost:4000/

另外若要以 utf8 編碼在 generate 前需要設定,目前還沒有用過,記下來參考。

set LC_ALL=zh_TW.UTF-8
set LANG=zh_TW.UTF-8

相關文章:

Octopress 安裝 + GitHub 架設部落格筆記

Octopress 安裝 + GitHub 架設部落格筆記

終於在奮戰了幾天之後,架好了我的 Octopress >__<

還記得小時候 (?) 一直都有寫 blog 的習慣,反而因為變成大人 (?) 之後荒廢了,

雖然號稱小小程式設計者,但我的學習歷程一直著重在邏輯的處理,

技術上長期沒什麼突破… (汗)

anyway 在某因緣際會下認識了 Markdown 進而發現了 Octopress 這個好東西,

不但可以用來撰寫技術文章,還可以達到快速排版的效果,

真的很吸引我這個懶惰蟲~

可是~~~~~~~~~~~~~~~~~~~~~~~~~~

對一個剛接觸「指令操作」不久、git 完全不熟悉的新手而言真的會覺得有點恐懼,

因此在這邊記錄我的安裝過程以及遇到的問題,希望能對跟我一樣困惑的小朋友有所幫助 :P

作業系統:OS X 10.9

Step1 安裝GIT

直接到網址下載安裝即可。

http://code.google.com/p/git-osx-installer

或者參考官網安裝方式。

http://git-scm.com/book/zh-tw/%E9%96%8B%E5%A7%8B-%E5%AE%89%E8%A3%9DGit

Step2 安裝Ruby

Ruby 有兩種版本控管工具,分別是 RVM 及 Rbenv ,選擇一種安裝即可

一開始我照著官網安裝 RVM 失敗了,所以當時改以 Rbenv 來安裝。

但因為歷史久遠我已經忘記拉~所以這邊先依照官網的說明貼上 XD

以下是 Mac 的建議安裝方法,先使用 Homebrew 套件管理工具來安裝 Rbenv ,

由於 Rbenv 只對 Ruby 進行版本控管,並沒有安裝的功能,因此必須另外安裝 ruby-build 才能進行安裝。

Rbenv

$ brew update
$ brew install rbenv
$ brew install ruby-build

安裝完 Rbenv 及 ruby-build 後便可以開始安裝 ruby 囉!

最後必須執行 rehash 來進行版本重置。

$ rbenv install 1.9.3-p0
$ rbenv rehash

然後~~~~

我的第一次 Octopress 安裝就到這裡中斷了 (掩面) ,

當時假會的裝了新版的 Ruby 2.0 ,

後來竟然和我的工作環境衝突,只好進行降版,

使用 Rbenv 降版幾次都失敗後,就被迫改以 RVM 重新安裝

畢竟工作時間就是金錢,老闆是不會等我 try N 次的 (哭)

一樣乖乖地輸入完下面的指令就可以摟~

RVM

$ \curl -L https://get.rvm.io | bash
$ \curl -L https://get.rvm.io | bash -s -- --autolibs=read-fail
$ \curl -L https://get.rvm.io | bash -s stable --ruby

// 舊版 rvm 指令
// $ rvm install 1.9.3p327
// 新版 rvm 1.29.3 ,版本命名方式有調整喔
$ rvm install ruby-1.9.3-p327

完成後可以輸入 ruby --version 來檢視是否安裝成功,

輸出訊息如: ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-darwin13.0.0]

準備好 Octopress 的前置工作終於可以進入正題了!

Step3 安裝Octopress

先將 Octopress 的 source code 複製到本機,

指令的最後指的是你希望存放的資料夾名稱,如果參考官網預設是使用 octopress

$ git clone git://github.com/imathis/octopress.git yourProjectName
$ cd yourProjectName

接著安裝 bundler

$ gem install bundler
$ rbenv rehash    #使用Rbenv套件者才需執行
$ bundle install

最後安裝 Octopress 預設的布景主題

$ rake install

基本上到這邊算是完成了 Octopress 的安裝,可以輸入以下指令來檢視是否安裝成功。

$ rake generate
$ rake preview

執行 rake preview 啓動 server 後,可以在 http://localhost:4000 檢視部落格。

Step4 部署GitHub

首先必須申請 GitHub 帳號,並且建立一個用來存放部落格代碼的程式庫 (Repository) 。

Repo 的命名必須遵照規則 username.github.io

例如我帳號/組織代號為 summerlize , Repo 則需命名為 summerlize.github.io 。

輸入指令設定 GitHub page

$ rake setup_github_pages

接著會要求輸入 Repo 的 URL , ex: git@github.com:summerlize/summerlize.github.io.git

Error:repository not found. fatal: The remote end hung up…

由於 GitHub SSH 對大小寫檢查非常敏感,若輸入錯誤則會遇到上方訊息,

建議從 Repo 頁面中右下方的 SSH clone URL 直接複製貼上,也可輸入 git remote -v show 檢查 URL 是否正確。

GitHub: SSH clone URL

編譯及發佈部落格

$ rake generate
$ rake deploy

Error:permission denied(publickey)

在執行 deploy 時我遇到了 permission denied(publickey) 的錯誤訊息,

原因是因為沒有 SSH 連結造成,若無此問題可跳過,

參考官方解決方法 GitHub:Generating SSH Keys

$ cd ~/.ssh
$ ls

檢視路徑中是否存在 id_rsa.pubid_dsa.pub 檔案,

如果沒有則需產生一組 SSH KEY ,如果有則可略過至下一步驟

$ ssh-keygen -t rsa -C "your_email@example.com"
# Creates a new ssh key, using the provided email as a label
# Generating public/private rsa key pair.
# Enter file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]
這邊直接按 enter

系統會要求輸入一組密碼,注意千萬不可空白否則就要重做了。

Enter passphrase (empty for no passphrase): [Type a passphrase]
# Enter same passphrase again: [Type passphrase again]

產生出的檔名為 id_rsa.pub ,接著複製 SSH KEY 。

$ pbcopy < ~/.ssh/id_rsa.pub

進入 GitHub 網頁中的 Account Setting ,選單中的 SSH Keys 按下新增,

將複製的內容貼在Key的位置,回到 terminal 輸入以下指令,

$ ssh -T git@github.com

收到以下訊息輸入 yes

The authenticity of host 'github.com (207.97.227.239)' can't be established.
# RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
# Are you sure you want to continue connecting (yes/no)?
yes

看到以下訊息表示授權成功

Hi username! You've successfully authenticated, but GitHub does not
# provide shell access.

重新 deploy ,第一次發佈會時間會比較長,

沒耐心的時間感判斷大約等了十分鐘有,

之後發佈也是不太一定,時快時慢的,所以要多重新整理幾次。

發佈完成把網址改成 GitHub 帳號就可以查看部落格囉~ http://username.github.com/

最後記得要把 Octopress source 也上傳到 GitHub

$ git add .
$ git commit -m 'initial source commit'
$ git push origin source

相關文章:

使用 Octopress 部落格發佈文章