SinatraのmodularスタイルでAuthlogicを使うときに起こりがちなエラー
authlogicをsinatraの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で使う人が少ない上に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をやってます。
認証は自分で作るのも多いみたいだけど既存のライブラリを使ってみることに。
AuthlogicがDeviseよりシンプルな感じで良さそう。
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
RubyとRubygemsを管理するための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 )
確認
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 # やらなくてもいいはずだけど
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で持ってきてそのままインストール実行。
あとは必要そうなパッケージを入れたり。
あたい、もう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見てくる。