Grails: A Quick-Start Guideを買いました。
ついでにGrails in Actionも買っちゃいました。
で、ざっと見た感想です。
Grails: A Quick-Start GuideはなんていうかStart Guideでした。例に習ってけばいい感じに身に付く感じ。はじめての人はこちらな感じがしました。
Grails in Action はどちらかというとUser Guideな感じ? 本家のUser Guide + いくつかプラグインの使い方という印象を受けました。
Grailsに触れてみたいならGrails: A Quick-Start Guide
Grailsに慣れてきたらGrails in Action
日本語がいいならGrails徹底入門
2009年10月30日金曜日
2009年10月28日水曜日
Custom Constraintsを使ってみた
制約を自由に追加できるプラグインがリリースされたので早速使ってみた。
とりあえずalpha(英字のみ許す)制約で作成する。
するとgrails-app/utils/AlphaConstraint.groovyが生成される。同時にテストケースも作成される。あとはvalidatorを書く感じにvalidateクロージャを実装する。
defaultMessageCodeを定義すると、定義したキーでメッセージが使える。
supportsはどの型用の制約かを定義する。
メッセージ定義に以下を追加する。埋め込みオブジェクトは、プロパティ名、クラス名、プロパティ値、制約のパラメタ。
これでドメインクラスに制約として使える。今までvalidatorに実装してたのも使い回しができるようになって最高です。validatorと違うところはメッセージキーを返せないところ。validateクロージャの実行結果がBoolean(boolean)にならないとClassCastExceptionが発生した。
使い方はこんな感じ。
つづいて他のプロパティを参照する系を試してみる。
例としてleProperty(他のプロパティ以下であること)制約を作る
他のプロパティを参照する場合は、やっぱりvalidatorの実装と同様に2つ目のパラメタを用意してあげればいい。
paramsは制約のパラメタ。
使うときは以下のような感じ。
制約を修正するとリロードするけど、その制約を評価したときに例外が発生する。そこは今後に期待です。
grails install-plugin constraints
とりあえずalpha(英字のみ許す)制約で作成する。
grails create-constraint alpha
するとgrails-app/utils/AlphaConstraint.groovyが生成される。同時にテストケースも作成される。あとはvalidatorを書く感じにvalidateクロージャを実装する。
class AlphaConstraint {
def defaultMessageCode = 'default.not.alpha.message'
def supports = { type ->
return type!= null && String.class.isAssignableFrom(type)
}
def validate = { propertyValue ->
propertyValue ==~ /[A-Za-z]+/
}
}
defaultMessageCodeを定義すると、定義したキーでメッセージが使える。
supportsはどの型用の制約かを定義する。
メッセージ定義に以下を追加する。埋め込みオブジェクトは、プロパティ名、クラス名、プロパティ値、制約のパラメタ。
default.not.alpha.message=Property [{0}] of class [{1}] with value [{2}] must be alphabet
これでドメインクラスに制約として使える。今までvalidatorに実装してたのも使い回しができるようになって最高です。validatorと違うところはメッセージキーを返せないところ。validateクロージャの実行結果がBoolean(boolean)にならないとClassCastExceptionが発生した。
使い方はこんな感じ。
class Book {
def title
static constraints = {
title(blank: false, alpha: true)
}
}
つづいて他のプロパティを参照する系を試してみる。
例としてleProperty(他のプロパティ以下であること)制約を作る
他のプロパティを参照する場合は、やっぱりvalidatorの実装と同様に2つ目のパラメタを用意してあげればいい。
class LePropertyConstraint {
def defaultMessageCode = 'default.not.leProperty.message'
def validate = { propertyValue, target ->
target."$params" ? propertyValue <= target."$params" : true
}
}
paramsは制約のパラメタ。
使うときは以下のような感じ。
class Project {
Date dateStarted
Date dateEnded
static constraints = {
dateStarted(leProperty: 'dateEnded')
dateEnded()
}
}
制約を修正するとリロードするけど、その制約を評価したときに例外が発生する。そこは今後に期待です。
2009年10月27日火曜日
Searchableプラグインであいまい検索
saveでindex作成するときにSynonymLookupProviderが提供するシノニムをindexに混ぜ込むかんじ。Searchable.groovyにURLが張ってあるからその通りにやってみた。
grails-app/conf/Searchable.groovy
src/groovy/sample/MySynonymLookupProvider.groovy
grails-app/domain/Book.groovy
これで new Book(title: 'artifact').save() すると、artefactで検索に引っかかるようになる。日本語でやるならSen入れないとだめぽい。
grails create-app myapp
cd myapp
grails install-plugin searchable
grails install-searchable-config
grails create-domain-class book
grails create-controller book
grails-app/conf/Searchable.groovy
compassSettings = [
'compass.engine.analyzer.myAnalyzer.filters':
'myAnalyzerfilter',
'compass.engine.analyzerfilter.myAnalyzerfilter.type':
'synonym',
'compass.engine.analyzerfilter.myAnalyzerfilter.lookup':
'sample.MySynonymLookupProvider'
]
src/groovy/sample/MySynonymLookupProvider.groovy
package sample
import org.compass.core.CompassException
import org.compass.core.config.CompassSettings
import org.compass.core.lucene.engine.analyzer.synonym.SynonymLookupProvider
class MySynonymLookupProvider implements SynonymLookupProvider {
String[] lookupSynonyms(String string) {
def synonyms = [string]
if (string == 'artifact') {
synonyms << 'artefact'
}
return synonyms as String[]
}
void configure(CompassSettings settings) throws CompassException {
}
}
grails-app/domain/Book.groovy
class Book {
String title
static searchable = {
analyzer 'myAnalyzer'
// title(analyzer: 'myAnalyzer') カラムごとに指定するなら
}
}
これで new Book(title: 'artifact').save() すると、artefactで検索に引っかかるようになる。日本語でやるならSen入れないとだめぽい。
登録:
投稿 (Atom)