魔法使いの見習いプログラマ

永遠の見習いプログラマの日記

routes.rbに悩む一日

ひとときSinatraにしようかと思いましたが、やっとRailsも10日目になりました。
今日は一日中ルーティングのことで悩んでしましました。
ログインしているユーザーには、異なるアクションに振り分けるつもりが
どうしてもリダイレクトしてくれません。


def index
    #ログイン済みユーザーnewへ移動する
    if user_signed_in?
      redirect_to :action => 'new'
    end
  end

  def new
    #処理
  end

(なお、ログインにはdeviseをつかっています。)

原因はroutes.rbに

resource :コントローラ名

を書き忘れていたためです。

rake routesで見ればすぐわかることだというのも、後から分かりました。
初心者なんてこんなもんです。

すこしづつですけど、Railsのこと分かってくると楽しいって思えるようになってきました。
直感でコードを書いて一回で思い通りの答えになると、とっても嬉しかったりします。

しばらくこんな感じでしょうが、ゆっくり理解していけばいいのかなって思っています。

Rails開発の流れがわかってきたかも

ここ3日間はRails漬けになっていました。
あまりにもScaffoldした後に何をすればいいのか分からなかったので・・・

やっとわかった気がします。
なお、環境についてはいろいろ考えまして、

Rails 3.0.10
Ruby 1.8.7

となっております。


流れとしては、

1.まずは、作るアプリでやりたい事を考えて、機能に落とし込む

2.画面遷移やDBのテーブルを考える

3.新規プロジェクトを立ち上げる(#rails new プロジェクト名)

4.利用するGemのインストールとGemfile内に書きこむ

5.bundle installを行う

6.config/database.ymlの設定と、modelの生成(rails generete model)、
db/migrate/内のマイグレーションファイルの設定

7.rake db:migrateでdatabaseに反映する

8.rails generate scaffold コントローラ アクション名
にて枠組みをつくる

9.Viewをつくる

10.viewとcontrollerでとりあえず動くものを作る。

11.とりあえず動くものが出来たら、ビジネスロジックをmodelに移動する。

12.テスト

本当にこれでいいのかちょっと自信がありません。
ただ、Controllerにいっぱいビジネスロジックを書くのはよくないというのは
そうかなって思います。あとあと自分が困ってしまうのかなって。

ま、まずは動くものをつくるのを目標にしてみます。

Siantraでのerb利用について

しばらくSinatraの勉強がつづきます。
Sinatraでのテンプレートエンジン「erb」の利用ですが

require 'erb'

get '/index' do
  erb :index
end

にて、前回作成したフォルダ/view/index.erbが読みこまれます。
HTMLにRubyを埋め込むことができます。

ちなみに、Viewを表示しているときのDocumentRootの扱いですが、

/var/www/pubric

となります。
ですので、このフォルダにCSSやscriptのフォルダを作っておけば、

ttp://www.hogehoge.com/CSS/1.css

ttp://www.hogehoge.com/script/piyo.js
のように呼び出すことができます。

ちょっとCSSやscriptはどこに置くのかなと思っていましたので
場所がわかってスッキリしました。

sinatraでのhaml利用について

さて、すっかり

Sinatraのほうが楽しいじゃん♪」

って理由だけでSinatraの記事ばかり書いているのですが、
Sinatraをつかってページをつくっていると少し困ったことがありました。

それは、
ビジネスロジックとページビューが同じファイル内にあるので見づらいよ〜。
ってことです。

そこで、

「こんなときにはテンプレートを組み込みましょう」

というのが今回のお題です。

今回はhamlをつかいます。
hamlXML形式からHTMLを作ってくれます。
とってもシンプルな記述方式で見た目もスッキリ!

さっそくつかってみます。

まずは、

#gem install haml

でインストール。

現在、httpdのDocumentRootフォルダ(/var/www/)内には
/var/www/public
/var/www/temp
の2つのフォルダがあるので、views用のフォルダを追加します。

#pwd
/var/www/
#mkdir view

DocumentRoot内にあるアプリケーションファイル(sample.rb)には

require 'rubygems'
require 'sinatra'
require 'haml'
require 'rack-flash'
require 'sequel'
# Sequel::Modelは呼び出し時にDB接続を要求する。
# lib/sequel_user.rbでDBを要求するので、接続してからrequireする必要がある。
DB = Sequel.connect (
  'mysql://username:password@localhost/sample_db',
  :compress => false
)

#rootフォルダとviewフォルダの設定
set :public, '/var/www/sinatra/public'
set :views, '/var/www/sinatra/views'

#Index Page
get '/' do
  haml :index
end

としてhamlをrequireしておきましょう。
フォルダの設定もお忘れなく〜。

haml :index

にて利用するテンプレートのファイル名を「index.haml」としましたので、
さっそく/var/www/viewsに作ってみます。

#vim /var/www/views/index.haml

!!! XML
!!!
%html
  %head
    %meta{ 'html-equiv' =>  'content', :content => 'text/html; charset=utf-8'}
  %body
    %div#container
      %h1 サンプルサイトにようこそ |

と書きます。

あとは、httpdを再起動するとトップページに

サンプルとにようこそ

と表示されます。

これで、ビューのところだけをデザイナーさんに渡すような場合でも安心です。
それではー。

sinatra/sequel/MySQLの組み合わせでハマる

表題の組み合わせでDB接続できるかどうか試してみたのですけど、
何度やってもMySQLの接続エラーでひっかかります。

最初、

DB = Sequel.connect ('mysql://username:password@localhost/sample_db')

と書いていたのですが、どうやら

DB = Sequel.connect (
  'mysql://username:password@localhost/sample_db',
  :compress => false
  )

のように
「圧縮プロトコルというものを使いませんよ」
というオプションを付けてあげる必要があるようです。

MySQLの圧縮プロトコルについては私もよくわからないので、
ちょっと調べてみますね。

ちょっとはまったのでメモメモ。

Sinatraが簡単すぎる件

とりあえず、毎回Weblickじゃちょっと・・・
と思っていたので、

こちらを参考に(というかそのまま)
Apacheで動かしてみました。

Sinatraで鼻歌まじりのWeb開発
http://www.slideshare.net/dara/sinatraweb?type=powerpoint

作業としては、
フォルダをひとつ作って(例:sample)

sample/public
sample/tmp

のフォルダをつくります。

sampleのフォルダ内には
先ほどのsample.rb
とconfig.ruというファイルを置きます。

config.ruの中身ですが、

require 'sample' #アプリケーション名
run Sinatra::Application

でオッケー。

あとは、passenger経由で動かすので
VirtualHostのDocumentRootを
先ほど作った

sample/public

にして、
/etc/init.d/httpd restart

すれば、ApacheとpassengerでSinatraが動いてくれます。

とっても簡単。
カンタンって素敵だよね。
サクッとできることって大好きです。

やっぱり私ダメなのかも・・・

けっきょく、今日は何にも書けていません。

3日目の壁・・・かな。

Rubyのことは大好きなので、ちょっと気分転換におもしろいものみつけたよ。

http://www.sinatrarb.com/intro-jp.html#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%86%85%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88

Sinatra(シナトラ)っていうんだって〜。

#gem install sinatra
でインストールして

sample.rb

require 'rubygems'
require 'sinatra'

get '/' do
  'Hello,world!!'
end

みたいにRubyのコードでそのまま書いて

#ruby sample.rb

するとあら不思議、Webricklocalhost:4567で動いて

アクセスすると

Hello,world!!

ってあいさつをしてくれます。

これってすごくない?


これなら私にもできるかも。