paperclipを使いつつcapistranoでdeployする方法
paperclipは初心者のためのRailsのプラグインまとめ - 常識という迷信でも書いたとおり、
Railsでとっても手軽に画像を扱う(アップロードしたり、いろいろ)ことができるプラグインです。
アップロードしたファイルの保存先は、デフォルトではrails_root/public/systemに保存されるのですが、
capistranoを使うとdeployするごとに画像へのパスが変更になって、えらく面倒です。
なので、rails_root/shared/以下に画像を配置し、rails_root/public以下にはシンボリックリンクを置くことにしましょう。
cd myapp mv current/public/system shared ln -s shared/system current/public/system
これでcap deployのたびに画像がなくなってしまう、なんてことにはならないはず。
他にもっと便利で怠惰な方法があったら教えてくださいえらい人。
Railsで画面表示後に遅れてデータを読み込む方法(Haml編)
初心者のためのRailsのプラグインまとめ
Railsってなにやらたくさんのプラグインが存在するみたいだけど、
「ユーザー管理ならコレ」みたいに、まとめがなかなか見つからないですよね。
ええ、当時の私には見つけることができませんでした。
でも、せめてプラグイン(Gem)名さえ分かってしまえば
Githubでいくらでも調べることできると思いませんか?思いませんか?思え。
なので今日は、やりたい事と数々のプラグインの対応表でも書いてみます。
Railsプラグインリスト!
これがやりたい! | オススメプラグイン |
---|---|
ユーザー管理 | Authlogic restful-authentication |
画像添付 | paperclip attachment_fu |
ページ送り(ページネーション) | will_paginate |
タグ!タグ! | acts-as-taggable-on |
テスト | rspec cucumber |
HTML&CSSの非生産性に絶望した | Haml&SASS |
ケータイ対応(日本の携帯) | jpmobile |
フォームを書くのがメンドクサイ | formtastic |
プラグインが最初からそろったテンプレ | bort |
プラグインピックアップ寸評
全部だと面倒なので、よく使うやつだけ。
Authlogic
私が使うのはコレ。最近ではほぼデファクトスタンダードですね。
また、TwitterOAuthやOpenIDなどのアドオンがあるのが魅力的。
restful-authentication
昔はこれを使ってました。
それなりに便利ですが、コントローラの分量が増えるのが難。
いまはどうなんだろう。
paperclip
いま画像系で使っているのはこいつです。
これも扱いが簡単です。対象となるモデルに4つ程のカラムを追加するなど、、まあ、簡単です。
ただ、画像をDBに保存するのではなく、ディレクトリに(ファイルとして)保存します。
なので、配備やバックアップの際に注意が必要です。
attachment_fu
こっちはDBに保存します。
でも、扱いが面倒に感じたので、いまはPaperclip一本です。
will_paginate
ページ送りの代名詞。
10以上のデータを扱うなら、必須だと思います。
acts-as-taggable-on
複数の種類のタグを管理できて、結構便利。
でも、大抵普通のタグとして使ってしまうのだけどね。
Haml&Sass
超オススメ。これがないと、Viewは書けないほどになってしまいました。
Hamlは、HTML/XHTMLを生成するためのマークアップ言語です。
下記のように、簡単な記述ができます。
HAMLでこう書くと、
!!! %html %head %title Hello, Haml! %body #header %h1 Hello, Haml! #content %p I use Haml %span.version= Haml::VERSION
HTMLでこうなる
<!DOCTYPE html> <html> <head> <title>Hello, Haml!</title> </head> <body> <div id='header'> <h1>Hello, Haml!</h1> </div> <div id='content'> <p> I use Haml <span class='version'>2.2.19 (Powerful Penny)</span> </p> </div> </body> </html>
Sassでこう書くと、
#main width: 90% p border-style: solid border-width: 1px border-color: #00f a text-decoration: none font-weight: bold a:hover text-decoration: underline
CSSでこうなる
#main { width: 90%; } #main p { border-style: solid; border-width: 1px; border-color: #00f; } #main p a { text-decoration: none; font-weight: bold; } #main p a:hover { text-decoration: underline; }
どうですか?簡単ですよね?
さっさと導入しましょう。
興味を惹かれた方は、日本Hamlの会をどうぞ。
他にもあれば、ツッコミお願いします。
コードを圧縮するRubyの黒魔術
まあ、行数的な意味で。正直、黒魔術でもなんでもないんですけど。
Rubyでプログラム書いてると、結構コードが短くなるよなーとおもうので、
ちょっとインスパイアされて書いてみる。
コレクションを使う
よくあるカタチを短くできる。
Before
managers = [] employees.each do |e| managers << e if e.manager? end
After
managers = employees.select{|e| e.manager?}
Before
friends = [] people.each do |person| friends << person if person == "Aon" friends << person if person == "Bon" friends << person if person == "Con" friends << person if person == "Don" friends << person if person == "Eon" end
After
friends = people.select do |person| %w[Aon Bon Con Don Eon].include? person end
こんなかんじか。
やっぱり書いてて楽しいなー
最近はリファクタリングの勉強中。
高いけど、結構楽しい。オススメ。
- 作者: Jay Fields,Shane Harvie,Martin Fowler,Kent Beck,長尾高弘
- 出版社/メーカー: アスキー・メディアワークス
- 発売日: 2010/02/27
- メディア: 大型本
- 購入: 8人 クリック: 312回
- この商品を含むブログ (37件) を見る
RubyonRails製CMSの「Radiant」導入メモ
なんかCMS使いたいと思っていた。
巷ではWordPressが流行ってるようだけど、
根が天邪鬼なのでrubyのCMSである、RadiantCMSを導入してみた。
だって、Ruby on Railsも使ってるみたいだしね。
前提条件
- サーバ:さくらインターネットの専用サーバ
- OS:ubuntu
- Apache:Passenger導入済
導入手順確認
githubで導入手順を確認する。
Home · radiant/radiant Wiki · GitHub
で、今回、OSはUbuntuだから、Ubuntu用のインストール手順を確認する。
なお、インストール手順が公開されているのは以下のOSだけぽい。
現時点ではWindowsの説明はなし。まあ、どうでもよいが。
導入する
Installing on Ubuntu · radiant/radiant Wiki · GitHub
上記みながらそのままコピペ。
sudo aptitude install ruby-dev libopenssl-ruby rubygems sudo aptitude install libsqlite3-dev sudo gem install rails radiant sudo gem install sqlite3-ruby export PATH=$PATH:/var/lib/gems/1.8/gems/radiant-0.8.1/bin
実行はもちろん自己責任で。
あと、こっちも参考に。
Installation · radiant/radiant Wiki · GitHub
で、ここからはgithubには、これといったドキュメントがなかった。
なので、似たようなドキュメントでしのぐ。
Home · radiant/radiant Wiki · GitHub
Download
radiant --database mysql WebsiteName
そうすると、WebsiteNameというプロジェクトが作成された。
次に、おもむろにINSTALLを確認。
== Installation and Setup
Once you have extracted the files into the directory where you would like to
install Radiant:
1. Create the MySQL/PostgreSQL/SQLite/SQL Server/DB2 databases for your Web
site. You only need to create the "production" database, but you may also
want to create the "development" and "test" databases if you are developing
extensions or running tests.
2. Edit config/database.yml to taste. There are example files available for
various databases in the config directory.
3. Run the database bootstrap rake task:
% rake production db:bootstrap
(If you would like bootstrap your development database run `rake
development db:bootstrap`.)
If you get the error "no such file to load -- spec/rake/spectask" please
install Rspec (gem install rspec).
4. Start it like a normal Rails application. To test execute:
% script/server -e production
And open your Web browser on port 3000 (http://localhost:3000). The
administrative interface is available at /admin/. By default the bootstrap
rake task creates a user called "admin" with a password of "radiant".
When using Radiant on a production system you may also need to set permissions
on the public and cache directories so that your Web server can access those
directories with the user that it runs under.
Once you've installed Radiant on your own Web site, be sure to add your name
and Web site to the list of radiant users:
ということなので、
- 本番用DBをMySQLで用意した。
- database.ymlを編集した。
- rake production db:bootstrap を実行した。
そんなにうまく行くわけがなかった。
ここで30分位つまづいた。
rake aborted! can't activate rack (~> 1.0.0, runtime) for [], already activated rack-1.1.0 for ["radiant-0.8.1"]
これは、rackのversionを1.0.0までにしろとかそういうことですか?
で、すでにrackは1.1.0が入っていたので、ダメと。そういうことのようです。
なので、特に気にせずrackの上位バージョン共をuninstallした。
sudo gem1.8 uninstall rack --version=1.1.0 sudo gem1.8 uninstall rack --version=1.0.1 rake production db:bootstrap
すると、順調に動き出しました。
あらかたDBの作成がおわったところでユーザなどを設定して終了。
一応、ログも残す。
reate the admin user (press enter for defaults). Name (Administrator): hogehoge Username (admin): fugafuga Password (radiant): Initializing configuration.........OK Select a database template: 1. Empty 2. Roasters (a coffee-themed blog / brochure) 3. Simple Blog 4. Styled Blog [1-4]: 4 Creating Snippets....OK Creating Pages....OK Creating Layouts....OK Creating Page parts....OK Finished.
Passengerで動かす
(2010/02/13 修正)
昔、以下のサイトにお世話になりました。
Apache上でRuby on Railsアプリケーションを動かす/Passenger(mod_rails for Apache)の利用 | Redmine.JP
.htaccessは、特に何も記述する必要はないとのこと(id:nunaさんより)。
あと、apache再起動のために必要なtmpディレクトリがなかったので、作った。
でその先にrestart.txtを作ってアクセスしたら、radiantCMSが動いてました。
mkdir tmp touch tmp/restart.txt
ということで完了。
ちゃんと使うなら、本を買ったほうが良さそう。
- 作者: 前田剛
- 出版社/メーカー: 秀和システム
- 発売日: 2009/06
- メディア: 単行本
- 購入: 2人 クリック: 69回
- この商品を含むブログ (7件) を見る
Actionは5行まで(入門編)
ruby1.9で有名なyuguiさんが、以前、以下のようなことをつぶやいております。
actionは5行まで。defとendを含めて7行まで。
Twitter / yugui : @akasata actionは5行まで。defとe ...
MVC関連の話として、Cは薄くMを厚く、という類の話ですね。
では、どうやってControllerのactionを短くすれば良いのか、
Controller側でできる基本的なことを書いてみます(Model側は今度いつかきっとそのうち)。
方針
Controller側でできる努力のひとつとしては、
パラメータ絡みの検証をなるたけActionから省くことがあげられます。
ひとつひとつのActionで個別のパラメータに対して、
if ~ else ~ endを多用しない、ということですね。
では、そのために必要な方法を考えていきます。
verifyでがんばる
簡単な条件を検証する場合、verifyを使います。
例えば、ユーザ作成を行う場合、
ユーザ名とパスワードに値が入っているかどうかを確認する必要があります。
これをAction内でやるのではなく、verifyとして、外側に出します。
class LoginsController < ApplicationController verify :params => [:username, :password], :render => {:action => "new"}, :add_flash => { :error => "Username and password required to log in" }, :only => :create def create @user = User.authenticate(params[:username], params[:password]) if @user flash[:notice] = "You're logged in" redirect_to root_url else render :action => "new" end end end
あーでも5行超えてますね。残念。
filterでがんばる
verifyよりも複雑な場合は、filterを使います。
以下では、before_filterを使った例を書いてみます。
よくありがちな、このような場合、before_filterですっきりひとつにまとめます。
class PostsController < ApplicationController # ... def show @post = Post.find(params[:id]) # ... end def edit @post = Post.find(params[:id]) end def update @post = Post.find(params[:id]) # ... end def destroy @post = Post.find(params[:id]) # ... end end
before_filterでスッキリ。
class PostsController < ApplicationController before_filter :find_post, :only => [:show, :edit, :update, :destroy] # ... def show # ... end def edit end def update # ... end def destroy # ... end private def find_post @post = Post.find(params[:id]) end end
おわりに
こんなカンジで、Actionの贅肉をそぎ落としていきましょう。
あと、つっこみ歓迎です。
また、verifyやfilterの各種パラメータの翻訳が欲しいひとは、
ダントツオススメのこちらの本を買いましょう。
- 作者: 高橋征義,松田明,諸橋恭介
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2011/07/25
- メディア: 単行本
- 購入: 33人 クリック: 932回
- この商品を含むブログ (37件) を見る
p.66あたりから詳しく書いてあります。