Archive for 10月, 2009

Ruby on Rails覚えるだ RSSフィードを作成。 詰まったところ大全

例えばブログサイトやサイトのニュース関連等、何かしら定期的に更新される内容をRSSで
配信したいと思った場合の方法を紹介。

まぁただ実際のRSS出力の部分については各所で取り扱われているので、うまくいかなかったりして詰まったあたりと純粋な手順を中心に紹介。他所の例の通りにやってるのにうまくいかないという人は参考になるかも。

例ではxxxxコントローラーのindexをRSSフィード元とする。

まず、ControllerのIndexを編集。
[code]
def index
処理

respond_to do |format|
format.html # index.html.erb
format.rss { render :layout => false }
end
end
[/code]
を追加。
どうもRails2.0以降ならこれはやらなくてもいいようなのだが、コントローラーがLayoutを使用している場合、それがRSSにも反映されてしまうので、
それを防ぐために上記処理を追加する。どうしても書きたくない場合は、
[code]
layout "レイアウト名", :except => :アクション
[/code]
等でそのアクションのレイアウトしようをとめることができるが、HTMLでのレイアウトも使えなくなってしまうので専用のアクションを作る必要がある。

そしてViewの中にindex.rss.builderを作成。
実際のBuilderの中身については各所で色々ちゃんとしたものがあるので今回は割愛。

さて、できたRSSフィードにアクセスしてみようとすると
[code]
class XxxxController < ApplicationController No route matches "/index.rss" def index [/code] と出てしまう。もうなにがわるいやら。 ちなみに、index.html.erbには問題なくアクセスできることは確認。 サーバーの再起動等も行ってみたが改善せず。 どうもフォーマットの部分がうまく伝わっていないようだということまでは分かるが、どう直せばいいのかわからなかった。 で、最終的にはRoutes.rbで [code] map.rss 'index.rss', :controller => 'xxxx', :action => 'index', :format => 'rss'
[/code]

とすることでごまかした。

なんとなく
map.connect

をうまくすれば何とかなりそうなのだが。

参考リンク
http://rubyist.g.hatena.ne.jp/rochefort/20090120
http://railscasts.com/episodes/87-generating-rss-feeds
http://rubist.blog77.fc2.com/blog-entry-64.html

さくらインターネットでRubyonRailsを使用する その3 SVNクライアントを入れる

せっかく作ったRailsプロジェクトもローカルとかインハウスだけで動かしていても意味がない。
誰でもアクセスできるようにデプロイ先を用意する必要がある。もちろん自前でサーバーをおったてることは
可能だが、正直電気代も馬鹿にならないものである。

そこで我らがさくらインターネット様の登場。非常に安価な値段でいい感じのサービスを提供してくれるのだ。

で、作ったプロジェクトを毎回わざわざFTPでアップロードというのもあまり好きくないし、人によっては
さくらインターネットをレポジトリにしたいと思う人もあるやもしれない。まぁ、これだけだとレポジトリとしては
不足だけど。ローカルで作ったプロジェクトをさくらに上げたいなら十分そうだ。

たださくらインターネットにはパッケージ管理とかがないので、色々面倒くさい

[code]
wget http://subversion.tigris.org/downloads/subversion-1.6.6.tar.bz2

wget http://subversion.tigris.org/downloads/subversion-deps-1.6.6.tar.bz2

tar -zxvf subversion-1.6.6.tar.bz2

tar -zxvf subversion-deps-1.6.6.tar.bz2

cd subversion-1.6.6

./configure --prefix=$HOME/usr --with-ssl --without-berkeley-db
[/code]
ここのprefixでSVNをインストールする先を選ぶ。実際にSVNの実体がここに置かれる。

[code]
gmake
*makeだとなにやら失敗した

gmake install
[/code]
で、インストールはおk。

パスを通してないと毎回わざわざインストール時に指定したフォルダを指定しないといけない。
要は
[code]
$HOME/usr/bin/svn
[/code]
とかやらないといけないので、
[code]
cd $HOME

vi .cshrc
[/code]
で、
[code]
# $FreeBSD: src/share/skel/dot.cshrc,v 1.14.6.1 2008/11/25 02:59:29 kensmith Exp $
#
# .cshrc - csh resource script, read at beginning of execution by each shell
#
# see also csh(1), environ(7).
#

alias h history 25
alias j jobs -l
alias la ls -a
alias lf ls -FA
alias ll ls -lA
# A righteous umask
umask 22
set path = HOME/usr/bin$HOME/local/bin $HOME/local/lib/ruby/gem/bin /sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin )
[/code]
set pathのところの先頭に$HOME/usr/binを追加。
これでわざわざパス指定をする必要はなくなる。

参照リンク
http://d.hatena.ne.jp/smeghead/20090601/svnclient

Ruby on Rails覚えるだ 既存プロジェクトのRailsバージョンの変更。

既存プロジェクトのRailsのバージョンを変更する場合の手順。

Railsプロジェクトを多言語化するための仕組みを調べる。
色々調べたところ、2.2以降にはi18nという仕組みが追加されていたのだが、
正直あんまり翻訳する身としてはやりにくいとは言いがたい。

ついで言うとPoEditを使った翻訳作業にも慣れていたので、Gettextを使うことに。

が、現在使用しているRailsバージョン、2.2.2はどうやらGettextとの相性が悪い(うまく動かない、参考資料が少ない)ようなので、
一番Gettextの文献が多い2.3.2にアップデートすることにする。

正直2.2.2でがんばればいけるかもと思ったけど、そこはやったことのないRailsのアップデートを
経験するという意味もこめて2.2.2から2.3.2へ

[code]
config/enviroment.rb
[/code]
の中の以下の部分のバージョンを希望のものに変更する。

[code]
# Specifies gem version of Rails to use when vendor/rails is not present
RAILS_GEM_VERSION = '2.3.2' unless defined? RAILS_GEM_VERSION
[/code]

このままだとあちこち問題が起きるので、

[code]
rake rails:update
[/code]
を走らせることでバージョン変更による仕様変更をある程度自動でやってくれる。
このあたりに関しては本当に環境と実装状況によって大きく変わると思うので、正直あまり参考にならないかも。

使用したプロジェクトでの変更点は
[code]
controller application.rb -> application_controller.rb
[/code]
になったくらい。まだ大して実装を進めていたわけではないのでこれで特に問題なく動いた。

肝心の多言語化については次回。

Ruby on Rails覚えるだ ActiveRecordのfindでdatetimeを使って検索したい。

RubyonRailsを使ってあれこれ作業中、とあるテーブルのdatetime型のデータから特定の月のみに合致するものを抜き出したくなった。

例としては、ブログアプリを作っていて、ある年とある月のエントリだけを抜き取って表示したい、とかそんな感じだ。
[code]
Entry.find(:all, :conditions=>)
[/code]
で条件を絞ればいいというところまではすぐ分かるが、datetimeの場合どのように絞ればいいのかがわからない。
通常文字列みたいに「xxxx =>”yyy”」という風にも、数値のように「xxx => yyy」とするわけにもいかないので、はまってしまった。

こういう時は困ったときのStackOverflow頼み。さっそく聞いてみた
http://stackoverflow.com/questions/1576027/how-to-use-datetime-in-the-condtions-of-a-find-count-in-ruby-on-rails
なんと投稿して三分で答が返ってきた。

さすが世界中のエンジニアのすくつですね。

で、例えば検索元のデータがdatetimeの場合、
[code]
xxx.find( :all, :conditions => ["month(yyy) = ? AND year(yyy) = ?", zzz.month, zzz.year] )
[/code]
このようにすれば合致する
yyyが検索対象のカラム、zzzが検索する条件となる。

ちなみに検索条件が固定の場合はこんな感じ。
[code]
xxx.find( :all, :conditions => ["month(yyy) = ? AND year(yyy) = ?", "09", "2009"] )
[/code]
当然findじゃなくてcountでも同じことができる。

どーでもいいことだけどやっぱり海外じゃ月、日、年なんだなぁと思った。
たぶん日本人的には
[code]
xxx.find( :all, :conditions => ["year(yyy) = ? AND month(yyy) = ?", "2009", "09"] )
[/code]