blog.takuyan.com

Ruby & Javascript & Hack

paperclipを使いつつcapistranoでdeployする方法


thoughtbot/paperclip · GitHub


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編)

f:id:kattton:20100708193024g:image
f:id:kattton:20100708193115g:image

画面を表示したときは、ローディング画像(くるくるしてるやつ)があって、
しばらくすると突然データが表示されるあれです。


Hamlを使ってるんですが、本気でいつも忘れるから、備忘録。

View (Haml)
#entry_ajax_view 
  != image_tag "/images/ajax-loader.gif"

- javascript_tag do 
  != remote_function :url => {:controller => :entries, :action => :ajax_view, :id => @entry.id}

この、たった2行が思い出せなくて。
いつも泣く。

Controller

マジ適当ですが。

class EntriesController < ApplicationController
  def ajax_view 
    @entry = Entry.find params[:id]
    render :update do |page|
      page.replace_html :entry_ajax_view, @entry.title
    end
  end 
end

ざっくりこんなカンジ。

RailsでjQueryが使えるjRailsのサイトが消えた!?

jRailsとは?


f:id:kattton:20100327154853p:image

Railsにはデフォルトでscriptaculousが付属していますが、
私はjQueryに置き換えて使っています。
置き換えるために、「jRails」というものを使います。

jRails作者のドメインが失効してしまったらしい


f:id:kattton:20100327154855p:image

この「jRails」は以前、ネットで話題になったものなのですが、
最近、ドメインが失効したらしいです。

Githubに避難したみたい

f:id:kattton:20091111232655p:image


で、どこいったかと思ったらGithubにいました。

aaronchi/jrails · GitHub


今後はこちらをどうぞ。


初心者のためのRailsのプラグインまとめ

f:id:kattton:20100326112445j:image
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

f:id:kattton:20100326112446p:image

いま画像系で使っているのはこいつです。
これも扱いが簡単です。対象となるモデルに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も同様にCSSを生成するマークアップ言語です。
こっちのほうがもっとスゴイ。

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の会をどうぞ。

他にもあれば、ツッコミお願いします。

おわりに


紹介していてなんですが、Rails関係の情報を調べようとすると、
残念ながら殆どが英語サイトなんですね。
私自身、英語が読めるわけでもないので結構面倒なんですね。


で、初心者から中級者になるまでのハードルが高いといわれているRailsなので、
もっと初心者向けの情報を提供することで、
(私にw)役に立つ情報を、誰かが、どこかに書いてくれるんじゃないかと思ったわけです。


なので、これからは、そんなことを期待しながら
いろいろ記事を書くことにします。

コードを圧縮するRubyの黒魔術

f:id:kattton:20100316003450j:image
まあ、行数的な意味で。正直、黒魔術でもなんでもないんですけど。


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

こんなかんじか。
やっぱり書いてて楽しいなー


最近はリファクタリングの勉強中。
高いけど、結構楽しい。オススメ。

リファクタリング:Rubyエディション

リファクタリング:Rubyエディション


あと、最近このサービス作った。
これについては、また今度書こうとおもう。

RubyonRails製CMSの「Radiant」導入メモ

f:id:kattton:20100211153734g:image
radiant/radiant · GitHub

なんかCMS使いたいと思っていた。
巷ではWordPressが流行ってるようだけど、
根が天邪鬼なのでrubyCMSである、RadiantCMSを導入してみた。

だって、Ruby on Railsも使ってるみたいだしね。

前提条件

導入手順確認

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:


http://wiki.github.com/radiant/radiant/radiant-users

ということなので、

  1. 本番用DBをMySQLで用意した。
  2. database.ymlを編集した。
  3. 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


ということで完了。
ちゃんと使うなら、本を買ったほうが良さそう。

入門 Radiant CMS

入門 Radiant CMS

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の各種パラメータの翻訳が欲しいひとは、
ダントツオススメのこちらの本を買いましょう。

Rails3レシピブック 190の技

Rails3レシピブック 190の技


p.66あたりから詳しく書いてあります。