はい、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は初めてだったのでかなり色々と調べながら作成しました…
また同じような所でハマった時のために備忘録として置いておきます。
コメントを書く