ウェブ-HACKS 「とりあえずやってみよう!」ブログでタグ「Ruby」が付けられているもの
以前にもブログで書いたRubyでHTMLファイル作成ですが、さらに改良しExcelの1行を1つのHTMLファイルに変換するプログラムを書きました。さらに、前回同様HTMLテンプレート機能も使用しています。Excelデータはタブ区切りテキストにします。
※プログラムはクリエイティブコモンズです。
YAMLも使ってみました。詳細は以下を参照。
config.yamlは以下の通り。
data.txtにタブ区切りテキストです。1行目のheader行の項目名をテンプレートファイル(template.rhtml)に設定すると項目が書く行の設定値でHTML生成します。また、1行目のid項目は必須でその項目値がHTMLファイル名になります。
※プログラムはクリエイティブコモンズです。
#!/usr/bin/ruby -Ks
require 'erb'
require 'yaml'
include ERB::Util
$KCODE = 's'
class CreateHtml
def initialize
@config = YAML.load_file("config.yaml")
@erb = ERB.new(File.read(@config[:template]), nil, "-")
end
def generate
objs = input
for obj in objs do
output(obj)
end
end
def input
objs = Array.new
count = 0
open(@config[:data]).each{|input|
if count == 0
@headers = input.split
count = 1
next
end
h = Hash.new
arr = input.split
@headers.size.times{|i|
h.store(@headers[i], arr[i])
}
objs.push(h)
}
return objs
end
def output(o)
open(@config[:output]+"/"+o['id']+".html", "w"){ |output|
output.write(@erb.result(binding()))
}
end
end
obj = CreateHtml.new
obj.generate
YAMLも使ってみました。詳細は以下を参照。
config.yamlは以下の通り。
:template: template.rhtml :data: data.txt :output: output
data.txtにタブ区切りテキストです。1行目のheader行の項目名をテンプレートファイル(template.rhtml)に設定すると項目が書く行の設定値でHTML生成します。また、1行目のid項目は必須でその項目値がHTMLファイル名になります。
以前に作ったRubyクローラーを改造して、検索フォームに自動で値を設定するプログラムをつくりました。その際にテキストフィールドのnameにハイフンがあり値の設定にはまったので解決方法を記載します。
以下ですとエラーとなります。 ※keyword-fieldにハイフンが入っているためです。
実は以下のように['keyword-field']とすればOK。簡単です。いろいろ検索したのですが、解決策が探せなかったので、記載してみました。
以下ですとエラーとなります。 ※keyword-fieldにハイフンが入っているためです。
page = @agent.get('http://example.com')
search_form = page.forms.with.action('http://example.com/search.html').first
search_form.keyword-field = keyword
実は以下のように['keyword-field']とすればOK。簡単です。いろいろ検索したのですが、解決策が探せなかったので、記載してみました。
page = @agent.get('http://example.com')
search_form = page.forms.with.action('http://example.com/search.html').first
search_form['keyword-field'] = keyword
ブログの更新も大分滞っていました。仕事が忙しくてなかなかWebScrapも作成する時間があまり取れないんですよね。おおよそ機能はつくれたのでいくつか、忘れないようにメモしときます。
今回は、Railsのエラーメッセージを日本語化するというもの。
Ruby-GetTextを使うのが一般的のようですが、今回はそこまできっちり作らなくても良いかなと思いActiveHeartを使用しました。以下手順載せます。すごい簡単ですよ。
まず以前にSubversionをインストールしてますので、railsコマンドで生成したフォルダで以下実行。
これだけでエラーメッセージが日本語化します。すごく簡単ですよね。
テーブルのカラム名はそのままですので、その場合はmodelに以下設定をすればOK
set_field_namesでカラム名と表示文字列をマッピングする
これで日本語化はOKです。ちなみにActiveHeart自体は非推奨とされており、Ruby-GetTextを使用するようにコメントされていますね。確かにサービスのグローバル化を考えればその方が良いと思います。
私はActiveRecordのエラー文言を日本語にしたいだけでしたので他のモジュールはコメントアウトしました。
一応そちらも記載しておきます。
【参考サイト】
今回は、Railsのエラーメッセージを日本語化するというもの。
Ruby-GetTextを使うのが一般的のようですが、今回はそこまできっちり作らなくても良いかなと思いActiveHeartを使用しました。以下手順載せます。すごい簡単ですよ。
まず以前にSubversionをインストールしてますので、railsコマンドで生成したフォルダで以下実行。
$ ruby script/plugin install http://svn.rails2u.com/public/plugins/trunk/active_heart/ + ./active_heart/init.rb + ./active_heart/lib/active_record_messages_ja.rb + ./active_heart/lib/iso2022jp_mailer.rb + ./active_heart/lib/trans_sid.rb
これだけでエラーメッセージが日本語化します。すごく簡単ですよね。
テーブルのカラム名はそのままですので、その場合はmodelに以下設定をすればOK
set_field_namesでカラム名と表示文字列をマッピングする
例)
class Bookmark < ActiveRecord::Base
set_field_names :title => 'タイトル', :url => 'URL'
validates_presence_of :title, :url,
:message => "が未入力です"
end
これで日本語化はOKです。ちなみにActiveHeart自体は非推奨とされており、Ruby-GetTextを使用するようにコメントされていますね。確かにサービスのグローバル化を考えればその方が良いと思います。
私はActiveRecordのエラー文言を日本語にしたいだけでしたので他のモジュールはコメントアウトしました。
一応そちらも記載しておきます。
warn 'ActiveHeart is obsolute plugin!' warn 'Please use Ruby-GetText or jpmobile' require_dependency 'active_record_messages_ja'if defined? ActiveRecord::Base
# Comment Out!
#require_dependency 'trans_sid' #require_dependency 'iso2022jp_mailer' if defined? ActionMailer::Base
【参考サイト】
こちらもWebScrapアプリケーションを作成中に疑問に思ったので覚書として書きます。操作完了したら元URLへリダイレクトしようと思ったのですが別サイト(別ドメイン)へのリダイレクトを以下2つの方法で試しました。
renderメソッドでは外部サイトにはリダイレクトできず、redirect_toを使用したら上手くいきました。
参考プログラムは以下の通りです。
renderメソッドでは外部サイトにはリダイレクトできず、redirect_toを使用したら上手くいきました。
参考プログラムは以下の通りです。
if @item.save
flash[:notice] = 'Item was successfully created.'
redirect_to("http://www.sample.com/")
else
render :action => 'new'
end
以前に話した「WebScrap」を仕事終わってから、作成しているのですが、Webページをキャッシュする部分でDBに保存するのはリソース上やはり厳しいということで自分のGMailに送信することにしました。
これであれば、Web上にHTMLのキャッシュを残しておくことができ、さらに過去にキャッシュしたHTMLページのデータもGoogleの検索エンジンで見つけられます。
Railsで通常のメールを送信するのは、以前の記事(ActionMailer)に書きましたが、HTML形式のメール送信の方法は以下の通りです。
まずはemailオブジェクトを生成し、content_typeを設定してからメール送信すればOKですね。
これであれば、Web上にHTMLのキャッシュを残しておくことができ、さらに過去にキャッシュしたHTMLページのデータもGoogleの検索エンジンで見つけられます。
Railsで通常のメールを送信するのは、以前の記事(ActionMailer)に書きましたが、HTML形式のメール送信の方法は以下の通りです。
- コントローラーに以下メソッドをprivateメソッドとして準備しました。
def sendmail(title, content, mail)
email = RMailer.create_sent( title, content, to )
email.set_content_type("text/html")
ScrapMailer.deliver(email)
end
まずはemailオブジェクトを生成し、content_typeを設定してからメール送信すればOKですね。
最近、Webアプリケーションを全然つくっていなかったので、以前からつくりたかったScrapBookのWeb版をつくりたいと思います。過去のブログで書いた「Firefoxで必ず使う7つのアドオン」の3位にしたScrapBookの簡易版(きちんとつくるのは手間がかかりそうなので・・・)をWeb上に保存できるサービスを考えてみたいなと思います。
※この前読んだレバレッジ勉強法にもあるようにWebのデータをスクラップできて、どんどん捨てていくようなことが簡単にできるように
ということでいつも通り要件定義
片手間でも2週間くらいでつくれないかなぁー。
※この前読んだレバレッジ勉強法にもあるようにWebのデータをスクラップできて、どんどん捨てていくようなことが簡単にできるように
ということでいつも通り要件定義
- まずはユーザ登録(メールアドレスとパスワードくらいで十分でしょう)
- URLを入力するとサーバに保存できる
- どこからでも登録したサイトが確認できて、ブックマークと違いリンクが消えていることがない(データをサーバに保存するから)
片手間でも2週間くらいでつくれないかなぁー。
設定ファイルでよく変更のあるデータを外出しにしておきたいことがあります。PerlではYAMLを使ってたのでRubyでも使用できないかと検索したら、なんと標準で使えることがわかりました。
今回はRubyでYAMLを使う方法です。
YAML(ヤムル)とは?
簡単なサンプル(例:設定ファイル)
配列やハッシュもテキストファイルにかけるので便利ですね。
今後は、設定ファイルをYAMLを積極的に使っていくと思います。
【参考サイト】
今回はRubyでYAMLを使う方法です。
YAML(ヤムル)とは?
- テキストプレーンで記載できるのでXMLより楽に記載できる(タグとかを記載しなくてよい)
- データを「配列」、「ハッシュ」、「スカラー」を記載するとオブジェクトに変換してくれる
- 設定ファイル、ログファイル等に使うと便利
簡単なサンプル(例:設定ファイル)
- 配列
- item1 - item2 - item3
- ハッシュ
name: Taro age: 28 email: test@test.testRubyで使用したサンプルソース
- オブジェクトをYAMLフォーマットでダンプする(Ruby → テキスト)
#!/usr/bin/ruby -Ks
require 'yaml'
$KCODE = 's'
hash = {"name" => "Taro", "age" => 28, "email" => ["test1@test.test", "test2@test.test"] }
# YAMLフォーマットでダンプする
puts YAML.dump(hash)
# 実行結果 > ruby main.rb --- name: Taro age: 28 email: - test1@test.test - test2@test.test
- YAML形式の設定ファイルをRubyで取り込む
# config.yamlファイル name: Taro age: 28 email: - test1@test.test - test2@test.test
#!/usr/bin/ruby -Ks
require 'pp'
require 'yaml'
$KCODE = 's'
# YAMLフォーマットでダンプする
config = YAML.load_file("config.yaml")
pp config
# 実行結果
> ruby main.rb
{"name" => "Taro",
"age" => 28,
"email" => ["test1@test.test", "test2@test.test"] }
配列やハッシュもテキストファイルにかけるので便利ですね。
今後は、設定ファイルをYAMLを積極的に使っていくと思います。
【参考サイト】
何度も同じようなプログラム(Rubyでスクレーピング)を作成しているような気がしますが、久々のRubyでクローラー作成。なんでこんなに何度も書くのかというと結構チェックしたいサイトが多く、仕事でも頼まれるためです。
※Perlで作成したクローラーはこちら
今回はきっちりクラスらしく作りました。結構汎用的になっているのではないかと思います。簡単なスクリプトです。
ソースはこれまで通りクリエイティブコモンズで。
かなり以下のサイト参考になります。何度も読ませて頂きました。
【参考サイト】
※Perlで作成したクローラーはこちら
今回はきっちりクラスらしく作りました。結構汎用的になっているのではないかと思います。簡単なスクリプトです。
ソースはこれまで通りクリエイティブコモンズで。
#!/usr/bin/ruby -Ks
require 'hpricot'
require 'mechanize'
require 'kconv'
$KCODE = 's'
class Crawler
def initialize(wait_time, internal, ngwords)
@agent = WWW::Mechanize.new
@wait_time = wait_time
@internal = internal
@ngwords = ngwords
@links = []
end
def http_connect(url)
print "OK\n"
@page = @agent.get(url)
end
def crawl(root)
@page = @agent.get(root)
@page.links.with.href(%r{}).each{|link|
if link.href =~ /^http/
url = link.href
else
%r|http://([^/]*)/| =~ root
url = 'http://' + $1 + '/' + link.href
end
@links << url.sub(/#.*$/,'')
}
@links.uniq!.delete(root)
puts @links
@links.each{|link|
begin
print link if $DEBUG
next unless access_test?(link)
http_connect(link)
sleep @wait_time
rescue => ex
puts ex.message
end
}
end
private
def access_test?(link)
unless %r|#{@internal}| =~ link
print "External Link.\n"
return false
end
@ngwords.each{|ng|
if /#{ng}/ =~ link
print "NG Word\n"
return false
end
}
true
end
end
かなり以下のサイト参考になります。何度も読ませて頂きました。
【参考サイト】
- Rubyでスクレーピング(mechanizeとhpricot)
- Perlでクロールする(LWP::UserAgent)
- RubyScraping - FrontPage
- Greenbear Diary - RubyでHTMLとWebを操作するためのライブラリ、HpricotとWWW::Mechanize , HikiReload
Rubyで静的HTMLファイル吐き出しのプログラムを作成したいなぁ思い、PerlのHTML::TemplateのようなものがRubyにもないか探してみました。
以下サイトにRuby版のHTML::Templateがあり使用したいと思ったのですが、少し使い勝手がわるいようです。
そのためerbにより作成することにしました。以下がテスト用でつくったサンプルコードです。
■メインプログラム
■テンプレートファイル
コマンドプロンプトより以下を実行してくれればOK
もうちょっとデータの持ち方だけ考えればもっと使いやすくなりそうです。
今度は外部ファイルから静的HTML吐き出しをするプログラムを書いてみます。
追記
外部ファイルを読み込んで静的HTMLファイル吐き出しするプログラムを書きました
【参考サイト】
以下サイトにRuby版のHTML::Templateがあり使用したいと思ったのですが、少し使い勝手がわるいようです。
そのためerbにより作成することにしました。以下がテスト用でつくったサンプルコードです。
■メインプログラム
#!/usr/bin/ruby -Ks require 'erb' include ERB::Util $KCODE = 's' filename = ARGV[0] erb = ERB.new(File.read(filename), nil, "-") # hash create. h = Hash.new title = "title_key" title_value = "title_val" h.store(title, title_value) detail = "detail_key" detail_value = "detail_val" h.store(detail, detail_value) # list create. list = Array.new list.push(h) print erb.result(binding())
■テンプレートファイル
<dl> <%- i = 0 -%> <%- for item in list -%> <dt><%=h item['title_key'] %></dt> <dd><%=h item['detail_key'] %></dd> <%- i += 1 -%> <%- end -%> </dl>
コマンドプロンプトより以下を実行してくれればOK
>ruby create_html.rb sample.rhtml
- title_val
- detail_val
もうちょっとデータの持ち方だけ考えればもっと使いやすくなりそうです。
今度は外部ファイルから静的HTML吐き出しをするプログラムを書いてみます。
追記
外部ファイルを読み込んで静的HTMLファイル吐き出しするプログラムを書きました
【参考サイト】
以前にRubyでメール送信 するプログラムを書きましたが(「RubyでHTTPヘルスチェックプログラムをつくる(mechanizeとnet/smtpを使用する)」)、SMTP認証が必要な場合に送信できないということと、HTMLメールを送信できないということがわかりました。メール送信 は良く使用するのでclassで作っておくかとも思い作り直しました。
TMailやActionMailer等もあるのですが、そこまできっちり作らなくてもいい場合用です。
【要件】
呼び出しは以下のような感じでOK!
結構簡単につくれました。
TMailやActionMailer等もあるのですが、そこまできっちり作らなくてもいい場合用です。
【要件】
- SMTP認証で
メール送信 できる - HTMLメールが送信できる
- classとして独立する
require 'kconv'
require 'net/smtp'
class SimpleMail
def initialize(from_address, smtp_server)
@from_address = from_address
@smtp_server = smtp_server
@smtp_port = 25
@smtp_domain = smtp_server
end
def send(to_address, subject, message)
contents = mail_contents(subject) + "\n"
contents << message
Net::SMTP.start(@smtp_server) {|smtp|
smtp.sendmail( contents, @from_address, to_address )
}
end
def send_html(to_address, subject, message)
contents = mail_contents(subject)
contents << 'Content-Type: text/html; charset="iso-2022-jp"\n\n'
contents << message.sub(/content="text\/html; charset=UTF-8"/, 'content="text/html; charset=iso-2022-jp"').tojis
Net::SMTP.start(@smtp_server) {|smtp|
smtp.sendmail( contents, @from_address, to_address )
}
end
def send_auth(to_address, subject, message, account, password)
contents = mail_contents(subject) + "\n"
contents << message
Net::SMTP.start(@smtp_server, @smtp_port, @smtp_domain, account, password) {|smtp|
smtp.sendmail( contents, @from_address, to_address )
}
end
private
def mail_contents(subject)
contents = "Subject: #{subject.tojis}\n"
end
end
呼び出しは以下のような感じでOK!
結構簡単につくれました。
# 例:HTMLメール送信
SimpleMail.new("from@address","smtp_server").send_html("to@address", subject, message)
これも忘れてしまいそうなので覚書Rubyの実行時のコマンドラインオプションです。
Rubyist Magazine出張版 Ruby on Windows
posted with amazlet on 08.01.18
cuzic
毎日コミュニケーションズ (2007/12/19)
売り上げランキング: 8193
毎日コミュニケーションズ (2007/12/19)
売り上げランキング: 8193
- 文法チェック(-c)
>ruby -c sample.rb Syntax OK
- デバッグモード(-d)
>ruby -d sample.rb --- sample.rg --- print debug_string if $DEBUG
- Rubyのバージョンの確認(--version)
>ruby --version ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
以前にPerlでクロールするプログラムを作ったので、勉強がてら今回はRubyで作成してみました。ただ今回はかなり、てこずりました。文字コード?のところではまってしまい作るのにまるまる1日かかりました。まずは出来上がったコード。
【事前準備】
【ソースコード】
ECショップの検索結果から商品情報を取得することを想定しているのですが、どうもカタカナの「ッ」が全て文字化けしてしまう。kconvではなくnkf、iconvを使っても結果はおなじ。解決方法としては以下1行を挿入するだけで文字化けはおきなくなりました。
原因はまだ調べているところですが、以下サイトをきちんと理解できればわかると思います。はぁー、大分はまってしまった。
【参考サイト】
【事前準備】
$ gem install hpricot $ gem install mechanize
【ソースコード】
#!/usr/bin/ruby -Ks
require 'hpricot'
require 'mechanize'
require 'kconv'
require 'jcode'
$KCODE = 's'
# 初期設定
@user_agent = 'Mac Safari'
@wait_time = 5
@url = 'taget_url'
def http_connect(url, keyword)
puts url if $DEBUG
@page = nil;@price = nil;@content = ""
begin
@agent = WWW::Mechanize.new
@agent.user_agent_alias = @user_agent
@page = @agent.get(url)
rescue
puts "#{keyword}#{@drim}CONNECTION ERROR"
return
end
link = @page.links.with.href(%r{http://target_url/\w+?/}).last
puts link.href if $DEBUG
if(link == nil || link.href.empty?)
puts "#{keyword}#{@drim}LINKERROR"
return
end
@page = @agent.click(link)
doc = @page.root
@name = (doc/"span.item_name").inner_html.tosjis
(doc/"span.item").each {|item|
item_str = item.inner_html.tosjis
item_str.scan(/(.*?)<\/div>(.*?)<\/div>/){|title, content|
@content += ":#{title}:#{content}" # if $DEBUG
}
item_str.scan(/([\d+] 円)/){|price|
@price = price
}
puts "#{keyword}#{@drim}#{@price}#{@drim}#{@name}#{@drim}#{@content}#{@drim}#{link.href}"
}
end
def generate_url
puts ARGV[0] if $DEBUG
File.open(ARGV[0]){|f|
f.each{|line|
keyword = line.chomp!
puts keyword if $DEBUG
target="#{@targeturl}?keyword=#{keyword}"
http_connect(target, keyword)
sleep @wait_time
}
}
end
puts @header
generate_url
ECショップの検索結果から商品情報を取得することを想定しているのですが、どうもカタカナの「ッ」が全て文字化けしてしまう。kconvではなくnkf、iconvを使っても結果はおなじ。解決方法としては以下1行を挿入するだけで文字化けはおきなくなりました。
require 'jcode'
原因はまだ調べているところですが、以下サイトをきちんと理解できればわかると思います。はぁー、大分はまってしまった。
【参考サイト】
RubyでHTTPアクセスが正常にできるかどうかを確認するツールを作成しました。
対象のURLにアクセスし、titleの文字列で正常にページアクセスできるかどうか確認しています。
エラー時は指定したメールアドレスにメールをとばすようになっています。
以下にソースコードを記載します。
※下線部は適宜環境にあわせてください
Windows環境でおこないました。
デバッグモードで実行するといくつか警告がでてますね。なんでだろ?
とりあえず動作はします。
【事前準備】
gemsでmechanizeをインストールする
> gem install mechanize
【ソースコード】
【参考にしたサイトです】
対象のURLにアクセスし、titleの文字列で正常にページアクセスできるかどうか確認しています。
エラー時は指定したメールアドレスにメールをとばすようになっています。
以下にソースコードを記載します。
※下線部は適宜環境にあわせてください
Windows環境でおこないました。
デバッグモードで実行するといくつか警告がでてますね。なんでだろ?
とりあえず動作はします。
【事前準備】
gemsでmechanizeをインストールする
> gem install mechanize
【ソースコード】
#!/usr/bin/ruby
require 'mechanize'
require 'net/smtp'
require 'kconv'
url = "http://localhost/"
wait_time = 15
@from_address = "from@mail_domain"
@send_address = "send@mail_domain"
agent = WWW::Mechanize.new
def send_alert( msg )
body = [ "Subject: HTTP Access Error\n", "\n", msg ]
Net::SMTP.start('mail_server') do |smtp|
smtp.sendmail( body, @from_address, @send_address )
end
exit
end
begin
while 1
page = agent.get(url)
s = page.title.tosjis
if s =~ /match_word/
puts "#{url}: #{s}\n" if $DEBUG
else
puts "#{url}: #{s}=#{match_str.tosjis}\n" if $DEBUG
send_alert("#{url}: #{s}\n")
end
sleep wait_time
end
rescue => ex
puts "#{url}: #{ex.message}\n" if $DEBUG
send_alert("#{url}:#{ex.message}\n")
end
【参考にしたサイトです】
Railsを使えば、あまりRubyの知識がなくてもWebアプリが作れます。
それはそれで、すごいことですが、やっぱりRubyも覚えてたい!という気持ちもあります。
というわけで、Rubyのメソッドについてちょっと試しました。
変数の値を返すだけであれば1行メソッドの方が良いかもしれません。
それはそれで、すごいことですが、やっぱりRubyも覚えてたい!という気持ちもあります。
というわけで、Rubyのメソッドについてちょっと試しました。
=begin
「Hello,Ruby」取得メソッド
1) 普通にメソッドを作成し呼び出す
=end
def hello_world()
hello = "Hello, Ruby."
return hello
end
puts hello_world() #=> Hello, Ruby.
=begin
2) 省略形
* Rubyではreturnを省略すると最後の式の値が返る
* メソッドの括弧は省略できる
* 改行が処理の区切りだが、「;」で区切ることも可能
※上記をふまえ以下のように変更
=end
def hello_world; hello="Hello, Ruby.";end
puts hello_world #=> Hello, Ruby.
変数の値を返すだけであれば1行メソッドの方が良いかもしれません。
会員登録時にメールを送信し、クリック後会員登録完了とすることで
メールアドレスのチェックをおこなう。
railsではActionMailerという仕組みにより、簡単にテンプレートメールを送信できます。
以下5つのSTEPで実装できます。
1) Rails環境ファイルにメールサーバを設定
以下environment.rbファイルにメールサーバの設定をする
- mytask/config/environment.rbに以下追加(下線部は環境によって変更する)
2) generateを使ってActionMailerを作成する
モデルとして作成されるので注意する。テンプレートファイルはviewファイルとして生成される
3) model(accout_mailer)の編集
※app/models/account_mailer.rbに以下メソッドを追加する
4) メールのテンプレートファイルを編集する
これで完了、5分くらいでできちゃいます。
メールアドレスのチェックをおこなう。
railsではActionMailerという仕組みにより、簡単にテンプレートメールを送信できます。
以下5つのSTEPで実装できます。
1) Rails環境ファイルにメールサーバを設定
以下environment.rbファイルにメールサーバの設定をする
- mytask/config/environment.rbに以下追加(下線部は環境によって変更する)
# Include your application configuration below
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.server_settings = {
:address => "address",
:port => 25,
:domain => 'domain',
:user_name => 'user_name',
:password => 'password',
:authentication => :login
}
2) generateを使ってActionMailerを作成する
モデルとして作成されるので注意する。テンプレートファイルはviewファイルとして生成される
$ ruby script/generate mailer AccountMailer sent
exists app/models/
create app/views/account_mailer
exists test/unit/
create test/fixtures/account_mailer
create app/models/account_mailer.rb
create test/unit/account_mailer_test.rb
create app/views/account_mailer/sent.rhtml
create test/fixtures/account_mailer/sent
3) model(accout_mailer)の編集
※app/models/account_mailer.rbに以下メソッドを追加する
$ ruby script/generate mailer AccountMailer sent
exists app/models/
create app/views/account_mailer
exists test/unit/
create test/fixtures/account_mailer
create app/models/account_mailer.rb
create test/unit/account_mailer_test.rb
create app/views/account_mailer/sent.rhtml
create test/fixtures/account_mailer/sent
4) メールのテンプレートファイルを編集する
※mytask/app/views/account_mailer/sent.rhtml を編集する5) controllerからメールモデルを呼び出す
def sendmail
@user = User.find(params[:id])
AccountMailer.deliver_sent(@user)
end
これで完了、5分くらいでできちゃいます。
ログイン機能は、作成すると案外面倒なもの。
他のフレームワーク同様、Railsにももちろん他のエンジニアが作成したモジュールを
簡単に再利用できる仕組みがととのっています
他のフレームワーク同様、Railsにももちろん他のエンジニアが作成したモジュールを
簡単に再利用できる仕組みがととのっています
- まずはrootユーザに変更
$ su - root
Password:
- gemでlogin_generatorをインストールする
# gem install login_generator Bulk updating Gem source index for: http://gems.rubyforge.org Successfully installed login_generator-1.2.2
- インストールが正常に完了したら、以下コマンドで作成開始
$ ruby script/generate login account
create lib/login_system.rb
create app/controllers/account_controller.rb
create test/functional/account_controller_test.rb
Railsを覚えようと思った理由の1つがscaffoldが使ってみたかったためです。アプリケーションに必要なスケルトンをコマンド1つで作成できるという優れものです。とりあえず本の通りにやってみました。
とりあえず、helpでコマンドを確認する
とりあえず、以下のコマンドで生成されるようです。
ruby script/generate scaffold [model_name] [controller_name]
それでは、実行してみます。
とりあえず、helpでコマンドを確認する
$ ruby script/generate scaffold --help
Usage: script/generate scaffold ModelName [ControllerName] [action, ...]
Rails Info:
-v, --version Show the Rails version number and quit.
-h, --help Show this help message and quit.
General Options:
-p, --pretend Run but do not make any changes.
-f, --force Overwrite files that already exist.
-s, --skip Skip files that already exist.
-q, --quiet Suppress normal output.
-t, --backtrace Debugging: show backtrace on errors.
-c, --svn Modify files with subversion. (Note: svn must be in path)
・・・省略
とりあえず、以下のコマンドで生成されるようです。
ruby script/generate scaffold [model_name] [controller_name]
それでは、実行してみます。
$ ruby script/generate scaffold project mytask
exists app/controllers/
exists app/helpers/
exists app/views/mytask
exists app/views/layouts/
exists test/functional/
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
・・・省略
これでスケルトンが生成されました。本当に簡単ですね。
今回はMySQLでデータベースとテーブル作成
以下3つのデータベースを作成する
(ただ、_testはどのように使うかよくわからなかったので、_developmentと_productionだけ作りました)
■データベースを作成
■テーブルを作成、カテゴリ(プロジェクト)とタスク
タスクを纏めるカテゴリのようなもの(ここではプロジェクト)テーブルとタスクそのもののテーブルを作成する。
■railsアプリケーションの設定ファイル(DB設定と文字コート)を編集
mytask/config/database.yml を編集
mytask/config/environment.rbに文字コード追加
以下3つのデータベースを作成する
(ただ、_testはどのように使うかよくわからなかったので、_developmentと_productionだけ作りました)
■データベースを作成
- mytask_development
mytask_test- mytask_production
mysql> create database mytask_development;
mysql> create database mytask_production;
mysql> grant all on mytask_development.* to username@localhost identified by 'password';
mysql> grant all on mytask_production.* to username@localhost identified by 'password';
■テーブルを作成、カテゴリ(プロジェクト)とタスク
タスクを纏めるカテゴリのようなもの(ここではプロジェクト)テーブルとタスクそのもののテーブルを作成する。
create table projects (
id int unsigned auto_increment,
name varchar(128) not null,
content varchar(255),
task_count int default 0,
status enum('close','open') default 'close',
created_at timestamp,
updated_at timestamp,
limited_at timestamp,
primary key (id),
index status_idx (status)
);
create table tasks (
id int unsigned auto_increment,
project_id int unsigned not null,
name varchar(128) not null,
content text,
status enum('yet', 'exec', 'finish') default 'yet',
created_at timestamp,
updated_at timestamp,
limited_at timestamp,
primary key (id),
index project_id_idx (project_id),
index status_idx (status)
);
■railsアプリケーションの設定ファイル(DB設定と文字コート)を編集
mytask/config/database.yml を編集
development: adapter: mysql database: mytask_development username: username password: password socket: /var/lib/mysql/mysql.sock encoding: utf8
mytask/config/environment.rbに文字コード追加
#KCODE = 'u' # Be sure to restart your web server when you modify this file.
いよいよ、Railsでアプリケーション作成します。本に書いている通りにすすめていきます。
railsコマンドはアプリケーションに必要なスケルトンを生成してくれるようです。
以下に手順を説明します。
1) railsでアプリケーション作成
rails [アプリケーション名]でrailsアプリケーションを作成する
2) WEBrickで動作確認する
Webrick(ウェブリック)とはRubyで作成されたWebサーバでRails開発(development)では
編集したコードが自動でロードされるため開発効率がよいです。
http://localhost:3000/でアクセスするとRailsのWelcomeページが表示される
railsコマンドはアプリケーションに必要なスケルトンを生成してくれるようです。
以下に手順を説明します。
1) railsでアプリケーション作成
rails [アプリケーション名]でrailsアプリケーションを作成する
$ rails mytask
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create components
create db
・・・省略
2) WEBrickで動作確認する
Webrick(ウェブリック)とはRubyで作成されたWebサーバでRails開発(development)では
編集したコードが自動でロードされるため開発効率がよいです。
$ cd mytask/ $ ruby script/server => Booting WEBrick... => Rails application started on http://0.0.0.0:3000ruby script/server でWEBrickを起動する
http://localhost:3000/でアクセスするとRailsのWelcomeページが表示される
かならずはまってしまうのが環境設定。1回設定すればOKですが、覚書として書いときます。
1) RubyとMySQLのバージョンを以下コマンドで確認できます
とりあえずレンタルサーバはFedora6でMySQLとRubyは既にインストール済み。以下コマンドで各々のバージョンを確認します。
Rubyのバージョンの確認方法
MySQLのバージョンの確認方法
ということで、まずはRailsのダウンロード&インストール
2) RubyGemsのダウンロード
RubyGemsはRubyのパッケージ管理ツールでRailsと関連ライブラリのインストールも簡単に行えるようになります。
というわけで、RubyForgeより「rubygems」をダウンロードする
3) RubyGemsのインストール
いよいよインストール。これが完了すればgemコマンドが使用できるようになります。
3) Railsのインストール
Gemsをインストール後、以下のgemコマンドでrailsをインストールする
こんな感じでOK!
1) RubyとMySQLのバージョンを以下コマンドで確認できます
とりあえずレンタルサーバはFedora6でMySQLとRubyは既にインストール済み。以下コマンドで各々のバージョンを確認します。
Rubyのバージョンの確認方法
$ ruby -v ruby 1.8.5 (2007-09-24 patchlevel 114) [i386-linux]
MySQLのバージョンの確認方法
$ mysql --version mysql Ver 14.12 Distrib 5.0.27, for redhat-linux-gnu (i686) using readline 5.0
ということで、まずはRailsのダウンロード&インストール
2) RubyGemsのダウンロード
RubyGemsはRubyのパッケージ管理ツールでRailsと関連ライブラリのインストールも簡単に行えるようになります。
というわけで、RubyForgeより「rubygems」をダウンロードする
3) RubyGemsのインストール
いよいよインストール。これが完了すればgemコマンドが使用できるようになります。
$ tar xvzf rubygems-0.9.4.tgz
$ ls
rubygems-0.9.4 rubygems-0.9.4.tgz
$ cd rubygems-0.9.4
$ ls
ChangeLog LICENSE.txt Rakefile TODO doc gemspecs pkgs redist setup.rb
GPL.txt README Releases bin examples lib post-install.rb scripts test
# su - root
# ruby setup.rb
3) Railsのインストール
Gemsをインストール後、以下のgemコマンドでrailsをインストールする
# gem install rails --include-dependencies $ rails -v Rails 1.2.4
こんな感じでOK!
次回こそ、Railsでアプリ作成に入ります。
Ruby on Railsはまだ試してみたことがないので、勉強のため、シンプルなタスク管理ツールをつくってみたいと思います。
私はタスク管理にCheck*Pad、SlimTimerなどを使っているのですが、どちらもとてもシンプルで使いやすいです。それらサービスを手本に、よりプロジェクト管理に適したツールに作成しようと思います。自分のタスクを洗い出すツールのため、名前はmyTaskにします。(後から変える可能性ありですが。。。)
簡単な機能紹介。
■ 機能一覧
とりあえずこれくらいでいいでしょう。
では次回からいよいよRailsを使ってみます。
私はタスク管理にCheck*Pad、SlimTimerなどを使っているのですが、どちらもとてもシンプルで使いやすいです。それらサービスを手本に、よりプロジェクト管理に適したツールに作成しようと思います。自分のタスクを洗い出すツールのため、名前はmyTaskにします。(後から変える可能性ありですが。。。)
簡単な機能紹介。
■ 機能一覧
- タスクを書き出せる(リストで見れる)
- タスクに期限を設定できる
- タスクには、未着手、実行中、完了等のステータスがある
- メールで期限がきたら教えてくれる
- カテゴリごとにタスクを纏められる
- タスクは共有できる
- 完了までにかかった時間を確認できる
とりあえずこれくらいでいいでしょう。
では次回からいよいよRailsを使ってみます。


