読者です 読者をやめる 読者になる 読者になる

HEYBlog about Technology

京都の学生エンジニアのエンジニアブログ

Ruby Sinatoraの基礎

ruby Sinatra

最小構成

main.rb
Gemfile
public
    images
views
config.ru

post get

post '/upload' do
    p ('hoge')
end

get '/images' do
    p ('hello')
end
    

image/hoge.png等の正規表現

get '/image/*' do
    p (params[:splat]) #=>hoge.png
end

get '/say/*/to/*' do
  # matches /say/hello/to/world
  params[:splat] # => ["hello", "world"]
end

get '/download/*.*' do
  # matches /download/path/to/file.xml
  params[:splat] # => ["path/to/file", "xml"]
end

get %r{^/([0-9a-f]{32}\.png)} do |image_name|
    p (image_name)
end

最後の正規表現のルーティングはパイプに入れたいものは()で閉じてあげる そうじゃないと Argument Errorで落ちる

文字列連結

hoge_1 = 'ho' + 'ge'
p (hoge_1)
hoge_2 = 'h'
hoge_2 <<'o'
hoge_2 <<'ge'
p (hoge_2)

ho = 'ho'
kyoto = 'kyoto'
hoge ="#{ho}ge#{kyoto}"

文字列置換

hoge ='hoge_sample'
new_hoge = hoge.gsub('sample','kyoto')
p (hoge) # -->hoge_kyoto

ルーティング正規表現

get %r{/[0-9a-f]{32}} do #OK
end

get %r{^/[0-9a-f]{32}} do #NG
end

^が大事。 ^がないと /00/0000c77b2fbd66dc65eaf09309873eb3 でも通ることになる

erbテンプレートとの連携

main.rb

get '/hoge' do
    @hoge ='hogeだこのやろう'
    erb:images
end

views/images.erb

  <p><%= @hoge%></p>

Sinatraで画像のバイナリデータを送る

data = nil
  File.open(image_path, 'rb') do |f|
    data = f.read
  end

  content_type "image/png"
  data

returnとかいちいち書かなくてええのが良いね!

アップロード処理

                                               
post '/upload' do
  image_name =''
  if params[:file]

    save_path = "./public/images/#{params[:file][:filename]}"
    image_name = params[:file][:filename]
    File.open(save_path, 'wb') do |f|
      p params[:file][:tempfile]
      f.write params[:file][:tempfile].read
      @mes = "アップロード成功"
      end
  else
    @mes = "アップロード失敗"
  end
  haml :upload
  #gsub パターンにマッチした部分をすべて指定の文字列に置換する                
  redirect 'images/'+image_name
end


 # アップロードした画像の表示                                                  
get '/images/*' do

  @image_path    =params[:image_path]
  haml :images
end

view関連 image.haml

!!!html5
%html
 %body
   %img{:src => @images_path}