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をつかいます。
hamlはXML形式から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に作ってみます。
!!! 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のことは大好きなので、ちょっと気分転換におもしろいものみつけたよ。
Sinatra(シナトラ)っていうんだって〜。
#gem install sinatra
でインストールして
sample.rb
require 'rubygems' require 'sinatra' get '/' do 'Hello,world!!' end
みたいにRubyのコードでそのまま書いて
#ruby sample.rb
するとあら不思議、Webrickが localhost:4567で動いて
アクセスすると
Hello,world!!
ってあいさつをしてくれます。
これってすごくない?
これなら私にもできるかも。