Rails4からGemfileにgroup :assetsブロックは不要?

Rails4プロジェクトをデプロイしようとしたらassets:precompileで落ちた…。
twitter/bootstrap/bootstrap.lessがないよと怒られる。
ん〜?require_tree . しているから、bootstrap_and_overrides.css.lessも読み込んでいるはずなのだが…(ここでtwitter/bootstrap/bootstrap.lessを読んでる)。
ぐぐったらstackoverflowがヒット。

‘twitter/bootstrap/bootstrap.less’ wasn’t found

Gemfileでassets groupを削除しなさいと書かれていた。
削除してからrake assets:precompileしたらうまくいった。

ちなみに自分はassets groupってなんのことだかよくわかってなかったのでさらにぐぐってみた。
How is the :assets group in rails 3.1 handled by bundler?

group :development, :test ということらしい。

あとついでに書くと、rake assets:cleanだとpublic/assetsディレクトリが消えない。
rake assets:clobberで消える。


cancan使ってるとstrong_paramtersでエラーになるよ。

Rails4.0化しようと思ってprotected_attributesを削除してstrong_paramtersに対応させようと思って、controllerに以下のように書きました。

def create
  piyo = Piyo.new(piyo_params)
  if piyo.save
    # 成功
  else
    # エラー
  end
end

private
def piyo_params
  params.require(:piyo).permit(:name, :detail)
end

すると、なぜかエラー…。
ActiveModel::ForbiddenAttributesError
sanitize_for_mass_assignmentでエラーが起きてると言われました。

しかしpermitで許可している項目しかpostしてないんだけどなーと思ってぐぐると、どうも原因はCanCanのようでした。

CanCan ActiveModel::ForbiddenAttributesError with rails 4

解決方法が書いてあったので、とりあえずそれを書きます。

application_controller.rbで、before_actionを定義します。
そこで、paramsの一部を先にstrong_parametersで上書きしてしまえばよいようです。

before_action do
  resource = controller_name.singularize.to_sym
  method = "#{resource}_params"
  params[resource] &&= send(method) if respond_to?(method, true)
end

うーむ、CanCan側で自動で対応してほしいところだけど…。


第一回かわいいKotlin勉強会でリモートLTしました。

記念すべき第一回かわいいKotlin勉強会が、昨日行われました。

最初にこのZusaarがたったときに、「Kotlinの勉強会、いいなぁ〜」と呟いたら、@ngsw_taroさんにリモートでLTしませんか?と誘われたので、せっかくだからやることにしました。
それにしても50人の枠で当日の前までは補欠も出るほど人気だとは、一体どういうこと???てっきり集まって20人程度くらいだろうと思っていたのですが、さすがに東京は懐が広い…。

当日、TLを見ていたら、なんだかスーツ族が多く、会場が静まり返っているというではないですか…。

ちゃちゃが入るわけでもなく淡々とした感じでLTが進んでいくのがUstreamを見ていてもわかる。

そして休憩時間になり…。

静からしい…。ただでさえリモートLTなのに大丈夫なのだろうか?

内容としては、主催の@ngsw_taroさんがKotlinの概要を、次に@bina1204さんがKotlinでAndroidアプリを作ってみたという話を。@bina1204さんの話は、Kotlinが生成したコードの話もしていて、深くまで話していてよかったです。しかしTL上では、Java->Kotlinにしてもそこまでコードが短くならんしメリットが感じられない…という空気になってました。

で、次に自分のKotlinAndroidLibを使ってみたという発表でした。UstreamとGoogleハングアウトを使った中継だったせいか、スライドの画面が変わらなかったので、@ngsw_taroさんに事前に渡していたpdfファイルをめくってもらう形でLTしました。さすがにリモートでのLTだったのでみなさんの反応が…。

スライドはこちら。

KotlinAndroidLibを使うと、コードが簡潔に書くことができるし、Kotlinらしいコードの勉強にもなるよという話をしました。コードはJavaの場合、Kotlinの場合、KotlinAndroidLibを使ったときの場合という3つを比較しています。これは自分でいうのもなんですが、TL上はかなり好評だった模様。

興味を持っていただけたようでよかったです!

次に、@hotchemiさんの、Kotlin Repositories。Kotlinのライブラリ紹介というところなんですが、だいたいのライブラリがKotlinのバージョンアップにやられてて動かないものが多いと…。たしかに…。KotlinAndroidLibも最初は動かないで困ったし…。Kotlinよくわかってない状態で、IntelliJのサジェストを頼りに直していった記憶が…。でも動くものもあるようで、Web FrameworkのKaraや、テストフレームワークのexpect.ktなどなど。テストフレームワークはSpecというやつも@ngsw_taroさんが紹介していたので、今後触っていきたいと思います。

そして最後に、JetBranisの代理店をやっているサムライズムのイケメンこと、@yusukeさんのKotlinでJavascriptの話…かと思いきや…。全然うまく動いてくれなかったのでKotlinでJavascriptは時期尚早。ということでPhpStormの操作説明会になりました。

圧倒的操作性!

やはりIDEはJetBrains製がいい。もうKotlinどこいった?みたいになってました。

最後にIntelliJ IDEA Ultimateのライセンス1名様プレゼントのじゃんけん大会が行われ、リモートで参加したけど一撃で負けてしまいました…。やはりIntelliJ IDEA買うしかないか!!

勉強会終了後は東京のほうでは懇親会があったようですが、当然岡山にいるので参加できず。いつかは現地で参加したいものです!

またあったら参加したいなーと思います。


postgresqlを9.1.4 => 9.2.4にアップデートした。

rails3.2のプロジェクトをrails4.0に移行している最中です。
なんかfeaturesのテストがおかしいのでcapybaraとcapybara-webkitを入れ直した方がよくね?と言われたのでそうするかーと思っていたらQtのバージョンアップもしといたほうがいいと言われたのでbrew upgradeしたらpostgresqlのバージョンも上がって色々変になったので直した。そのときのメモ。

参考にした記事。
Upgrading from PostgreSQL 9.1.x to 9.2.x with Homebrew

まず、アップグレードしてしまった。

brew upgrade

で、なんか動かなくなったので、参考URLを元に、pg_upgradeをしてみた。

launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
mv /usr/local/var/postgres /usr/local/var/postgres91
initdb /usr/local/var/postgres -E utf8
pg_upgrade \
  -b /usr/local/Cellar/postgresql/9.1.4/bin \
  -B /usr/local/Cellar/postgresql/9.2.4/bin \
  -d /usr/local/var/postgres91 \
  -D /usr/local/var/postgres
cp /usr/local/Cellar/postgresql/9.2.4/homebrew.mxcl.postgresql.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

postgresqlは動き出したのだが、今までのデータベースのデータが見当たらなくなってしまった…。
どこにあるのだろうか?いろいろとやっていたから、作業順序をミスって/usr/local/var/postgresをやっちまったのかもしれない。

まぁとりあえずpostgresqlは動いたのだが、今度はrailsがpostgresqlに繋がらなくなった。
pgsql_socketの位置が悪いみたいなことだった。

元々は
/var/pgsql_socket/.s.PGSQL.5432
にあったものが、バージョンアップしたら
/private/tmp/.s.PGSQL.5432
に移動してしまったようだ。

Fixing Postgres connection errors on Mountain Lionを参考に、シンボリックリンクをはった。

権限がないのでsudoしながらの作業。

sudo mkdir /var/pgsql_socket/
sudo chown _postgres:_postgres /var/pgsql_socket
sudo ln -s /private/tmp/.s.PGSQL.5432 /var/pgsql_socket/

あとはなんとかなったけど、データベースとかなくなってたので、作り直したりした。
あとpostgresqlのroleとかも作り直したり。
こういうのでハマるとちょっとやっかいすなぁ…。時間かかるし。


h2データベースのバックアップ、リストア

h2データベースでのバックアップ、リストアの方法。

ORMLiteを使っているのだけれど、とりあえずはdaoオブジェクトでexecuteすればいいということにする。
ちなみにコードはKotlinです。

object DatabaseHelper {
  val connectionSource by Delegates.lazy {
    val databaseUrl = "jdbc:h2:~/test"
    JdbcConnectionSource(databaseUrl)
  };
  {
    setUpDatabase(connectionSource)
  }

  private fun setUpDatabase(connectionSource: ConnectionSource) {
    TableUtils.createTableIfNotExists(connectionSource, javaClass<User>())
  }
  fun getUserDao() : Dao<User, Int> = DaoManager.createDao(connectionSource, javaClass<User>())!!

  fun close() = connectionSource.close()

  fun backup(backupPath: String) {
    getUserDao().executeRaw("SCRIPT TO ? COMPRESSION GZIP", backupPath)
  }

  fun restore(filePath: String) {
    getUserDao().executeRaw("RUNSCRIPT FROM ? COMPRESSION GZIP", filePath)
  }
}

BACKUP TO “filename.zip”だと、データベースファイルをzipに固めたものが取れるのだけれど、できればmysqldumpみたいなのが欲しいなと思っていて調べたところ、SCRIPT TO “filename”がよいということがわかった。その上でさらに圧縮したい場合は、後ろにCOMPRESSION GZIPを付ければいいらしい。

リストアは、RUNSCRIPT FROM “filename”です。こっちはまだ確かめてないけど。これも圧縮状態から読み込めるらしい。

参考URL:
https://groups.google.com/d/msg/h2-database/fJgSDA6-iKs/Iyc7P9e3fRQJ