SinatraのmodularスタイルでAuthlogicを使うときに起こりがちなエラー

authlogicsinatraのmodularスタイルで使おうとするとsinatra_adapter.rbでこんな感じのエラーが出ることがある。

authlogic-3.0.3/lib/authlogic/controller_adapters/sinatra_adapter.rb:50:in `included': undefined method `before' for Sinatra::Request:Class (NoMethodError)

これは'sinatra'ではなく'sinatra/base'のみrequireした場合に起こる。
たぶんsinatraがmodularスタイルに対応する前に作成されたんじゃないかと思う。

なのでsinatra_adapter.rbを以下のようにSinatra::Baseを使うように変更。

# Sinatra::Request.send(:include, Authlogic::ControllerAdapters::SinatraAdapter::Adapter::Implementation)
Sinatra::Base.send(:include, Authlogic::ControllerAdapters::SinatraAdapter::Adapter::Implementation)

これでどっちでも動くはず。あまりまだ動作をチェックしてない。とりあえずエラーはない。

動かしたバージョンは以下のとおり

sinatra
1.2.6
authlogic
3.0.3

問題はここで報告されててだいぶ経ってるんだけど治ってない。Sinatraで使う人が少ない上にmodularスタイルじゃないと起こらないからかな。。
Sinatra adapter does not work with latest versions of Sinatra, Rack, and Ruby · Issue #80 · binarylogic/authlogic · GitHub

Sinatraでユーザー認証にAuthlogicを使う

Sinatra使ってみたいなと思って、Sinatra+Slim+ActiveRecordをやってます。

認証は自分で作るのも多いみたいだけど既存のライブラリを使ってみることに。
AuthlogicDeviseよりシンプルな感じで良さそう。
GitHub - binarylogic/authlogic: A simple ruby authentication solution.


基本これそのままactionやhelperなどを持ってきて、migration動かしてviewsのhamlをslim化したら動いた。
GitHub - ehsanul/Sinatra-Authlogic-Template: An Authentication Solution for Sinatra


例えばlogin.hamlはこんな感じに変更。

## login.slim
p Login

form method="post"
  div
    p
      | email:
      input type='text' size='20' name='user[email]'
  div
    p
      | password:
      input type='text' size='20' name='user[password]'
  div
    p
      | Remember me:
      input type='checkbox' value='1' name='user[remember_me]'
  input type='submit' value='Login'

ユーザー認証はAuthlogicだけど、権限による認可は全然提供していないので自分でなんとかしていいかも。
GitHub - ryanb/cancan: Authorization Gem for Ruby on Rails.
こんなライブラリもあって面白そうだけど。


slimは見た目簡潔なんだけど

input type='text' size='20' name='user[email]'

より

input :type => 'text', size => '20',  :name => 'user[email]'

とか書けた方がRubyっぽくていいなーと思った。

でも、そうなるとHamlに戻ってしまう悲しさ。

Ubuntuで日本語ロケール設定

ServersMan@VPSを使ってるんだけど、Ubuntuを入れたらsshで入っても全然日本語で入力が出来なかった。

ロケール設定ってやつですね。

他の環境でもたまに「あれ?このサーバ日本語入らない」ってなるので設定方法を。
もう完全にこちらの方法です
HugeDomains.com - Shop for over 300,000 Premium Domains

# apt-get install language-pack-ja
# dpkg-reconfigure locales
# update-locale LANG=ja_JP.UTF-8

これで次回ログインから日本語が打てるようになった。
なんだかんだで日本語打ちたいことがあるので助かりました。

Macで環境を整えるための環境-homebrewとrvmとrubygems-

http://dev.kakkunpakkun.me/?p=236こちらへ移行しました。
情報の修正などは移行先の方でやりますのでご注意ください。


環境整備ってなんだか楽しい気分になってしまうものですね。
ちまちまとportで使いもしない言語やサーバを入れたりrubyのいろんなバージョンを入れたり。

でも、プログラム書いたりしたいのにいつまでもそんなことやっててもしょうがないので当面環境を整えるための環境を固めて、後顧の憂いをなくして先へ進めるように書き記しておく。

ミドルウェアRuby以外の言語を整えるための管理システムhomebrew

GitHub - Homebrew/legacy-homebrew: 💀 The former home of Homebrew/homebrew (deprecated)
portより気軽で分かりやすいからこっちにしました。

brew install git

こんな感じでgemコマンドっぽいのもいい。

CellarやKegといった管理方法も分かりやすかった。

homebrewをインストール
ruby -e "$(curl -fsS http://gist.github.com/raw/323731/install_homebrew.rb)"
設定

homebrewが入るとなにかと/usr/binより/usr/local/binを優先したいので、~/.bash_profileの先頭にこんなのを書き加えておきました。

export PATH=/usr/local/bin:$PATH

RubyRubygemsを管理するためのrvm

Account Suspended
Rubyもhomebrewでやろうかと思ったけど、1.8.6系、1.8.7や1.9.2、はてはMacRubyも使いたいのでそこらへんの切り替えが簡単なrvmを使うようにした。
これで各Rubyでインストールしたgemも別に管理出来るしいいんじゃないかと思った。
インストールはまんまドキュメントの通りAccount Suspended

rvmをインストール
bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )
設定

bash_profileの末尾にこれを追記

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"
確認
source ~/.bash_profile
type rvm | head -n1
=> rvm is a function #これが出たらOK
Rubyをインストール

ここを参考にインストール
Account Suspended

とりあえず1.9.2を入れる。Rails3.0も出たし。

rvm install 1.9.2
rvm use 1.9.2 # やらなくてもいいはずだけど
確認

とりあえずrubyもgemも同じバージョンのものを使っているか。/usr/binのrubyやgemを使ってないか。

which ruby
=> /Users/kakkunpakkun/.rvm/rubies/ruby-1.9.2-p0/bin/ruby
which gem
=> /Users/kakkunpakkun/.rvm/rubies/ruby-1.9.2-p0/bin/gem

(ユーザーが僕の場合こんな風)

Railsなどrubygemsで入れられるものはrubygems

Railsをインストール
gem install rails # suやsudoではない
確認
which rake
=> /Users/kakkunpakkun/.rvm/gems/ruby-1.9.2-p0/bin/rake
which ruby rails
=> /Users/kakkunpakkun/.rvm/gems/ruby-1.9.2-p0/bin/rails

同じrubyで同じgemだと確認。

あとはhpricotだろうとnokogiriだろうとgemでインストールしちゃいます。

うまくいかないとき

/usr/binのrubyやgemが邪魔なときは名前を変更して追いやっちゃいました。

mv /usr/bin/ruby /usr/bin/ruby_old

hotcocoa入れたり

$ hotcocoa TestProj

って打ったらコマンドがなかった。
macgemなんて知らなかったんだ。

# macgem install hotcocoa
$ hotcocoa TestProj
$ cd TestProj
$ macrake

これでとりあえずウィンドウが出てくるとか面白い。XCode通してないぞ!

macgemは初めて見たけど普段のrailsものとかは普通のgemコマンド使ったほうがいいかなと思ったりした。

homebrewをインストールした

新しいiMacがきたから最近よく聞くMac向けのパッケージ管理システムのhomebrewを入れてみた。

GitHub - Homebrew/legacy-homebrew: 💀 The former home of Homebrew/homebrew (deprecated)

こんなコマンド打ったら入った。

ruby -e "$(curl -fsS http://gist.github.com/raw/323731/install_homebrew.rb)"

curlで持ってきてそのままインストール実行。

あとは必要そうなパッケージを入れたり。

brew install wget
brew install git

あたい、もうRailsさんのことわかんない

ついにRailsについて行けなくなった。というか、「あたい、もうRailsさんのことわかんない!」って気分。

前からscaffoldでこんな感じの複雑なrespond_toとか返されてるのがなんだかなーという気持ちだった。

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @entry }
end

あと、こういうのも直感的なのか?

<%= link_to 'Back', entries_path %>

entries_pathってなんすかってなった。いつの間に生まれたんだおまえ。

routes.rbにもこういうルーティング書かれちゃうから、

map.resources :entries

新しいrestfulじゃ全然ないアクション追加するときにtoutes.rbいじらないとだめだった。
:collectionとかやったら動作した。struts-config.xml思い出した。

map.resources :entries, :collection => { :tags => :get , :search => :get}

なんかrestfulとかでうまい方法あるのかもしれない。でも、なんでもパーフェクトなrestfulアプリにしたいわけじゃないんだよう。

と、scaffoldを実行しなきゃ生まれない嘆きな気がするけどrailsは着々と分からないことになっていってた記念かきこ。


昔みたいにうまくいかなかったからいちゃもん付けたかったんだ。ちょっとsinatra見てくる。