LoginSignup
25
22

More than 5 years have passed since last update.

sinatra + redis 事始め (mac)

Posted at

ためしにクラシックなWebチャットを作ってみることにする。

sinatra, redis をインストール。

gem と brew で入れる。

gem install sinatra sinatra-contrib redis hiredis --no-ri --no-rdoc -V

brew install redis

redis サーバを起動

特に難しく考えずデフォルト設定で起動する。

redis-server

port 6379 で起動しています。

irb で redis につなげることを確認

簡単!

irb> require 'redis'
irb> rd = Redis.new host:"127.0.0.1", port: "6379"
irb> puts rd.keys
[]
irb> rd.set :hello, "world"
irb> rd.keys
 => ["hello"] 
irb> rd.get :hello
  => "world"

でもリスト系の操作はけっこう癖がある。これは redis 側の癖のようだ。

リストの「右に追加する」「左に追加する」「右から取り出す」みたいな。スタックの概念を上下にしなかったのがとても新鮮。

キューでもスタックでもナチュラルに理解できる。うまいなぁ。

アプリを作成

実は sinatra も全然知らないのである。

URL構成

  • /main

    • ログを表示する
    • 発言フォームを表示する
  • /talk

    • ログに追記する
    • /main へリダイレクトする

テンプレートは erb とする。

作成する

  • 名前をセッションに入れる。
  • 表示は10件まで
  • 発言は一行のテキストで無限に redis のリストに突っ込む。
mychat.rb
require 'sinatra'
require "sinatra/reloader" if development?
require "rdiscount"
require "redis"

redis = Redis.new host:"127.0.0.1", port:"6379"

configure do
  enable :sessions
end

get '/main' do
  @name = params[:name]
  @logs = redis.lrange :logs, 0,9
  erb :main
end

post '/talk' do
  msg = params[:msg]
  session[:name] = name = params[:name]
  redis.lpush :logs, sprintf("[%s] : %s" , name, msg)
  redirect '/main'
end

views ディレクトリを作成し、main.erb を作成する。

views/main.erb
<form action="/talk" method="post">
  <input type="text" name="name" value="<%= session[:name] %>" size="10">
  <input type="text" name="msg" value="" size="80">
  <input type="submit" value="送信"/>
</form>
<hr/>
<% @logs.each do |log| %>
  <p><%= log %></p>
<% end %>

実行する

ruby mychat.rb

html ヘッダすらないし、ログを無限に格納していくのですぐ破綻するけど、とにかく動いた。

25
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
22