query: tag:sinatra

SassをSinatraで使うときに、グローバルオプションとして
テンプレートファイルの場所を指定する場合、

ruby>>
set :sass, :load_paths => '/path/to/templates'
<<--

という感じに指定すると思っていたのですが、いつの間にか

ruby>>
set :sass, :views => '/path/to/templates'
<<--

と指定しないと認識しないようになっていた。

SinatraがテンプレートエンジンとしてTileを採用あたりから変わったのかもしれない。

posted by genki genki on Sun 17 Apr 2011 at 19:00 with 0 comments

link_to 等のヘルパメソッドは sinatra 本体には含まれていませんが、
sinatra_more という gem が用意されています。

install

shell>>
% gem install sinatra_more
<<--

standalone 利用の場合

直接 Sinatra::Base に register してしまいましょう。

ruby>>
require 'sinatra'
...
require 'sinatra_more/markup_plugin'
Sinatra::Base.register SinatraMore::MarkupPlugin
...
get '/' do
...
<<--

クラス利用の場合

該当クラスで register します。

ruby>>
require 'sinatra_more/markup_plugin'

class Application < Sinatra::Base
register SinatraMore::MarkupPlugin
end
<<--

MarkupPlugin

link_to だけでなく、全56種(ver 0.3.33 現在)ものヘルパメソッドが利用できるようになります。
以下に、よく使いそうなものを抜粋します。

ruby>>
link_to(*args, &block)
stylesheet_link_tag(*sources)
javascript_include_tag(*sources)
image_tag(url, options={})
image_path(src)
escape_html(text)
h!(text, blank_text = ' ')
content_tag(*args, &block)
tag(name, options={})
input_tag(type, options = {})
form_for(object, url, settings={}, &block)
text_field_tag(name, options={})
<<--

詳細は lib/sinatra_more/markup_plugin/*.rb を確認して下さい。

その他のPlugin

sinatra_more gem には、
MarkupPlugin 以外にも
RenderPlugin、WardenPlugin、MailerPlugin、RoutingPlugin
といったプラグインが用意されています。
利用方法は MarkupPlugin の場合と同じで、
利用したいプラグイン名を列挙していきます。

ruby>>
require 'sinatra_more/markup_plugin'
require 'sinatra_more/render_plugin'
Sinatra::Base.register SinatraMore::MarkupPlugin
Sinatra::Base.register SinatraMore::RenderPlugin
...
<<--

各プラグインの代表的なメソッドを記載します。
例えば、RenderPlugin にはみんな大好きな "partial" が入ってたりしますので、しっかりチェック&register しましょう。

RenderPlugin

描画系プラグイン

ruby>>
partial(template, options={})
erb_template(template_path, options={})
haml_template(template_path, options={})
render_template(template_path, options={})
<<--

WardenPlugin

認証系プラグイン

ruby>>
current_user
authenticate_user!
logged_in?
authenticated?(&block)
<<--

MailerPlugin

メール関係?(使わないので未調査)

RoutingPlugin

ルーティング系プラグイン (named route?)

ruby>>
map(*args, &block)

map(:accounts).to('/accounts/url')

map(:admin, :show).to('/admin/show/:id')

map(:admin) { |namespace| namespace.map(:show).to('/admin/show/:id') }

<<--

posted by maiha maiha on Thu 4 Feb 2010 at 00:22 with 0 comments

もともとSinatraではRack::Reloaderが上手く機能しないのでshotgunを使おうという流れだったのですが、諸般の事情でshotgunを使えない状況になったため、本腰を入れてRack::Reloaderを使えるようにする方法を調べました。

結論として、以下のようにすれば使えました。

config.ru

ruby>>
configure :development do
class Sinatra::Reloader < Rack::Reloader
def safe_load(file, mtime, stderr = $stderr)
::Sinatra::Application.reset!
use_in_file_templates! file
stderr.puts "#{self.class}: reseting routes"
super
end
end
use Sinatra::Reloader
end
<<--

reset!を呼び出した後use_in_file_templates!を呼ぶ事で、in-fileテンプレートをもう一度読み込んでいます。

posted by genki genki on Mon 12 Oct 2009 at 02:26 with 0 comments

Sinatraを使ってRack::Auth::OpenID等を使う場合、
shotgunを使って開発をしていると、check_authentication関係のエラーが出てくる事があるようです。

rackupを利用すれば問題は起きないのですが、Sessionがらみの問題でしょうか。shotgunが無いとリロードが結構面倒なので、はやく回避策が見つかると良いです。

See Also

posted by genki genki on Sun 11 Oct 2009 at 20:47 with 0 comments

Railsにおけるrestful_authenticationやMerbのビルトイン認証機構に比べると、Sinatraには「とりあえずこれを使っておけ」というような認証ライブラリが無いような気がします。強いて言えばRack::Auth::Basicかな。ちょっと機能不足のように感じます。
という事で、Sinatraで使える認証用ライブラリをリストアップ。

その他、関連する面白そうなもの。

posted by genki genki on Sat 10 Oct 2009 at 17:58 with 0 comments

Sinatraのインラインテンプレート(__END__以降に記述するテンプレート)が真っ青になって見難かったので、インラインテンプレートだけHamlとしてシンタックスハイライトするようにしてみました。

Before

ss1

After

ss2

見やすいですね。

INSTALL

Vimに
sintax/haml.vim
などをインストールした上で、以下のような設定を記述します。

.vim/ftdetect/ruby.vim

pre>>
" Sinatra
au BufNewFile,BufRead *.rb set filetype=ruby | unlet b:current_syntax | syn include @rubyData syntax/haml.vim | syn region rubyDataHaml matchgroup=rubyData start="^END$" keepend end="%$" contains=@rubyData | syn match inFileTemplateName "^@@\w+" containedin=rubyData | hi def link inFileTemplateName Type
<<--

See Also

posted by genki genki on Sat 22 Aug 2009 at 20:44 with 0 comments

Rub
はHaml的なEndless Rubyを気軽にはじめるために作ったGemです。
GitHubをsourceに追加して以下のようにインストールできます。

pre>>
% sudo gem install genki-rub
<<--

ソースコード
を見るとわかりますが、非常に短いので現時点では、if文の複数行にまたがる条件文などには対応していません。気が向けばそのうち対応するかもしれません。

Rubを使ってSinatraアプリを作るには以下のようにします。

config.ru

ruby>>
require "rubygems"
require "rub"
rub "app.rb"
run Sinatra::Application
<<--

app.rb

ruby>>
require "sinatra"
require "dm-core"
require "haml"

DataMapper::setup(:default, ENV['DATABASE_URL'] || 'sqlite3://db.sqlite3')

class Post
include DataMapper::Resource
property :id, Serial
property :content, Text
auto_upgrade!

get "/" do
@posts = Post.all(:order => [:id.desc])
haml :index

post "/" do
Post.create(params)
redirect "/"

END
@@ index
%h1 Hello, Sinatra!
%ul

  • @posts.each do |post|
    %li= post.content
    %form{:method => :post}
    %textarea{:name => :content}
    %input{:type => :submit, :value => "Post"}
    <<--

面白い点として、
Endless RubyでもVimやこのブログのSyntaxハイライトはちゃんと機能してくれます(Emacs使いのレポート求む)

必要なファイルはこれだけです。あとはおもむろにshotgunしましょう。

pre>>
% shotgun
== Shotgun starting Rack::Handler::Mongrel on localhost:9393
<<--

あとはhttp://localhost:9393にアクセスするだけです。
app.rbを適当に書き換えてリロードすると、変更が反映される事が確認できます。

shotgunは
pre>>
% sudo gem install shotgun
<<--

でインストールできます。

posted by genki genki on Mon 20 Jul 2009 at 04:55 with 2 comments

Merbの開発がなかなか進展しないのでSinatraをちょっと触ってみたところ、
DataMapper、Herokuとの組み合わせが非常に簡単でいい感じでした。

blog.rb
ruby>>
require "rubygems"
require "sinatra"
require "dm-core"
require "haml"

DataMapper::setup(:default, ENV['DATABASE_URL'] || 'sqlite3:db.sqlite3')

class Post
include DataMapper::Resource
property :id, Serial
property :content, Text
auto_upgrade!
end

get "/" do
@posts = Post.all(:order => [:id.desc])
haml :index
end

post "/" do
Post.create(params)
redirect "/"
end

END
@@ index
%h1 Hello, Sinatra!
%ul

  • @posts.each do |post|
    %li= post.content
    %form{:method => :post}
    %textarea{:name => :content}
    %input{:type => :submit, :value => "Post"}
    <<--

config.ru
ruby>>
require "blog.rb"
run Sinatra::Application
<<--

ローカルで起動するには

pre>>
% ruby blog.rb
<<--

もしくは

pre>>
% rack
<<--

でok. rubyの場合はhttp://localhost:4567、Rackの場合は http://localhost:9292 にアクセス。

これをHerokuにデプロイすると、
http://sinatora-blog.heroku.com/
こんな感じで動きます。

posted by genki genki on Tue 14 Jul 2009 at 14:56 with 2 comments