sinatraでハマったとこまとめ

  • 2018.08.09
  • Web
sinatraでハマったとこまとめ

はい、DAFUです。

今回はTipXXXをローンチしたので開発中にハマったところをまとめました。

さて、開発中にハマったところをまとめて行きましょう。

sinatraでハマったところまとめ

公式ドキュメントに大体載ってますのでまずは一通り目を通すことを推奨します。

BASIC認証で参考にしたサイト
こちら

will_paginateで参考にしたサイト
こちら

PC/SP振り分けで参考にしたサイト
こちら

部分テンプレートの作成・読み込み

読み込みたいテンプレートファイル(ex.temp.erb)を読み込みたいファイル(ex.index.erb)に読ませる場合

<% erb :'temp' %>

BASIC認証の実装

例: (get ‘/admin’)に実装する場合

helpers do
    def protect!
        unless authorized?
            response['WWW-Authenticate'] = %(Basic realm="Restricted Area")
            throw(:halt, [401, "Not authorized\n"])
        end
    end
    def authorized?
        @auth ||= Rack::Auth::Basic::Request.new(request.env)
        username = 'user' #ここの値がユーザー名になる
        password = 'pass' # ここの値がパスワードになる
        @auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == [username, password]
    end
end

(省略)

get '/admin' do
    protect! #認証をかけたいリクエストにこれを追加する
    erb :admin
end

404ページの実装

ここでは例としてnotFound.erbを読み込む。

また、他のエラーページの実装は公式ドキュメントを参照。

not_found do
    erb :notFound
end

ページネーションの実装

Sinatraではgemが使えるので今回はwill_paginateを使う。

第二引数の:per_pageで1ページあたりの項目数を決定している。

gem install will_paginate
gem install will_paginate-bootstrap

(Gemfile書き込み→bundle installでも〇)

#書き換え後サーバー(ex.puma)の再起動必須
#wil_paginateの読み込み
require 'will_paginate/active_record'
require 'will_paginate/view_helpers/sinatra'
require 'will_paginate-bootstrap'

#Classを追加する
class
    MainApp < Sinatra::Base helpers WillPaginate::Sinatra,WillPaginate::Sinatra::Helpers 
end 
get '/' do 
@contents = Data.all 
end
#ページネーションする項目の設定(Dataは読み込みたいもの) @models = @contents.paginate(:page => params[:page], :per_page => 10) #表示には@modelsを使用する

 

<%= will_paginate @models, inner_window: 5, previous_label: "<<", next_label: ">>", renderer: BootstrapPagination::Sinatra %>
#inner_window - 横並びになるページ数
#previous/next_label - 前へ・次へに該当する文
#renderer - Bootstrapを指定しておくとマークアップが楽になる

 

ユーザーエージェント判定によるPC/SP振り分け

ここではPC/SPの振り分けのみですがもっと詳細に書けばAndroidとIOSなども分けられます。

ua = request.user_agent
    @sp = 0
if ["Android","iPhone", "iPad", "iPod"].find {|s| ua.include?(s) }
    @sp = 1
end
<% if @sp == 0 %>
    PC用コンテンツ
<% end %>
<% if @sp == 1 %>
    SP用コンテンツ
<% end %>

 

HTMLエスケープ

helpers do
    include Rack::Utils
    alias_method :h,:escape_html
end
<%= h @hoge.fuga %>
#hを付けるだけ

フォーム投稿から空欄をはじく

ここではエラーを出す感じですが、処理はご自由にどうぞ。

empty?をここでは使っていますが、nil?とかも使えると思います。

get '/form-action' do
    hissu = params[:hissu]
    unless hissu.empty?
        Data.create({
        title: params[:hissu],
        })
        redirect '/' #TOPページへ
    else
        #エラー時処理
        redirect '/error' #error処理に飛ぶ
end
<form action="/form-action" method="get">
    <input id="hissu" name="hissu" required="" type="text" />
</form>

まとめ

Rubyは初めてだったのでかなり色々と調べながら作成しました…
また同じような所でハマった時のために備忘録として置いておきます。