Hatena::Grouphackathon

zrail (a.k.a. tobira17, h14i, ...) の Learning Log

2014-09-16

[][]Custom conditions 18:38 Custom conditions - zrail (a.k.a. tobira17, h14i, ...) の Learning Log を含むブックマーク はてなブックマーク - Custom conditions - zrail (a.k.a. tobira17, h14i, ...) の Learning Log

最近 Sinatra ばっかり触ってる。


ところで、GETのときは不要だけど、POSTのときは必要、みたいな before filter が必要になった。まぁよくある、ログイン状態によって分岐する、みたいな処理なんだけど。

class App < Sinatra::Base
  set :method do |name|
    # 引数の case を気にしたくないので downcase 付けて大文字でも小文字でも動くようにしてる
    condition { request.request_method.downcase == name.downcase }
  end

  before '/article', method: 'post' do
    redirect to('/login') unless authenticate?
  end

  get '/article' do
    # do something
  end

  post '/article' do
    # do something
  end
end

いやこの例酷いな…。こんなリソース設計有り得ないだろ…。

まぁ、サンプルの酷さはとりあえず置いておいてくだしあ。

単に GET '/article' が飛んできた場合はログインしてるかどうか関係なく同じページを返したい。しかし、 POST '/article' の場合はログイン必須、みたいな状況だと思ってください。

before '/article' だと GET と POST の両方に適用されてしまうので、フィルタの中で request_method を調べて分岐する必要がある。けど、それだとあまりにダサ読みづらいので、フィルタに入る前にそこは調べてしまいたいなぁと思って作ってみた。

モアベターな方法があるのかも知れないが、取りあえず動いてる。

ちなみにこの :method condition さん、 get とか post の condition としても指定できるけど無意味です。

2014-09-13

[][]Sinatra 環境で Rack middleware を一覧する 01:29 Sinatra 環境で Rack middleware を一覧する - zrail (a.k.a. tobira17, h14i, ...) の Learning Log を含むブックマーク はてなブックマーク - Sinatra 環境で Rack middleware を一覧する - zrail (a.k.a. tobira17, h14i, ...) の Learning Log

Rails なら普通に middleware を覗くとか rake middleware するとかすればいいんだけど、 Sinatra だとそういうわけにはいかない。

ので、 around alias (っていうんだっけ?)を使って適当に use をラップして出力する。

require 'sinatra/base'

class Rack::Builder
  alias original_use use
  def use(middleware, *args, &block)
    warn "use #{middleware}"  # とりあえず $stderr に出力している
    original_use middleware, *args, &block
  end
end

class App < Sinatra::Base
end

App.new

上のサンプルは動作確認してない(しろよ)ので動くかどうか分からないけど、だいたいこんな感じ。

こんな感じの rake task を作っておくと役に立つ…かも。


簡単に説明。

最後の App.new の段階で Rack::Builder#use が呼ばれる。

App.new を起動するときに use される middleware 以外は出力されないので、必要なら他にもインスタンスを作る必要がある。

2014-04-12

[][]NeoBundleLazyなvim-railsvim-projectile 13:04 NeoBundleLazyなvim-railsとvim-projectile - zrail (a.k.a. tobira17, h14i, ...) の Learning Log を含むブックマーク はてなブックマーク - NeoBundleLazyなvim-railsとvim-projectile - zrail (a.k.a. tobira17, h14i, ...) の Learning Log

*追記:API変わったみたいなのでこれだと動かないかも。気が向いたら直します。

あんまりrailsに触らなくなったのでrails.vimを遅延読み込みさせたい。

でもrails.vimを使わないと手軽にrailsプロジェクトを検知できない。

取り敢えずtpope先生の準新作projectile.vimを使ってみる。

んで試行錯誤した結果。

autocmd vimrc User ProjectileDetect
\   if !empty(findfile('rails', './.direnv/bundler-bin')) || !empty(findfile('rails', './bin'))
\ |   TabpageCD %:p:h
\ |   call neobundle#source('vim-rails')
\ |   if RailsDetect()
\ |     call rails#buffer_setup()
\ |     silent doautocmd User BufEnterRails
\ |   endif
\ | endif

僕の環境がごちゃごちゃしてるので余計な物がいっぱい入ってるので補足。

TabpageCDを入れてるのは僕がTabpageCDユーザーである*1のと:e PATHなときでも移動して欲しいため。localrc系のものでやっても良いかも。

findfile()でRailsなプロジェクトかどうか判断してるけど、このやり方がベストなのかはあやしい。

わざわざRailsDetect()を呼んでるのは、まぁ大した理由はなくて、単にb:rails_rootを設定するよりも上手くやってくれるでしょう、みたいな感じ。direnvはただの趣味。

そのあとのrails#buffer_setup()とかは上との関連で、b:rails_rootが設定されていないってことは多分呼び出されてないだろう、みたいな感じ。ちゃんと調べてない。


autocmdの発火順序調べる良い方法ないのかなぁ。verboseの使い方よくわかんない。


もう関数切れよって感じだな…。

*1:そりゃそうだ

2014-04-11

[][]rbenvでバージョンを指定してコマンドを実行する 05:47 rbenvでバージョンを指定してコマンドを実行する - zrail (a.k.a. tobira17, h14i, ...) の Learning Log を含むブックマーク はてなブックマーク - rbenvでバージョンを指定してコマンドを実行する - zrail (a.k.a. tobira17, h14i, ...) の Learning Log

1.9.xじゃないと動かないgemのコマンドを実行したいが、そのためだけに (global|local|shell) を実行するのは面倒、みたいなケース。

% RBENV_VERSION=1.9.3-p448 rbenv exec COMMAND

この方法でirbを実行してみてRUBY_VERSIONを見ると指定したバージョンになっているはず。

これが正しい方法なのか分からない。知ってる人いたら教えて下さい。

2013-04-10

[][][]Ruby on Rails関連のメモ 17:43 Ruby on Rails関連のメモ - zrail (a.k.a. tobira17, h14i, ...) の Learning Log を含むブックマーク はてなブックマーク - Ruby on Rails関連のメモ - zrail (a.k.a. tobira17, h14i, ...) の Learning Log

別にSinatraとかでも良いんだけど、Web方面をちょっとやろうと思い始めたのでメモ置き場設置。