掲示板を作ってみる・その6【ヘルパを作る】
掲示板を作ってみる・その1【何を作るの?】
掲示板を作ってみる・その2【モデルを作る パート1】
掲示板を作ってみる・その3【モデルを作る パート2】
掲示板を作ってみる・その4【ルーティングを考える】
掲示板を作ってみる・その5【コントローラを生成】
掲示板を作ってみる・その6【ヘルパを作る】
掲示板を作ってみる・その7【スレッド用コントローラを編集】
掲示板を作ってみる・その8【レス用コントローラを編集】
掲示板を作ってみる・その9【レイアウトファイルとスタイルシートファイルを作成】
掲示板を作ってみる・その10【スレッド用のビューファイルを作成】
掲示板を作ってみる・その11【レス用のビューファイルを作成】
掲示板を作ってみる・その12【ruby-gettext で日本語化】
controller を生成したので、その中身を定義したいところですが、helper を先に定義してしまいましょう。
controller や view などで使いたいが、controller ファイルや view ファイルの中では定義したくないメソッドを定義しておく、それが helper だったりしますが、さて、helper を定義します。
app/helpers/topic_helper.rb は編集なし。
app/helpers/post_helper.rb
module PostHelper
def date_format(date)
wdays = ['日', '月', '火', '水', '木', '金', '土']
date.strftime('%Y/%m/%d(') + wdays[date.wday] + date.strftime(') %H:%M:%S')
end
def generate_id(ip_address, created_at)
return '???' if ip_address.blank?
id_chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/'
today = created_at.strftime("%Y%m%d").to_i
ip_address_sections = ip_address.split('.')
for i in (0..3)
ip_address_sections[i] = ip_address_sections[i].to_i + 1
end
res_id = []
res_id[0] = id_chars[today % ip_address_sections[0] % id_chars.size, 1]
res_id[1] = id_chars[today % ip_address_sections[1] % id_chars.size, 1]
res_id[2] = id_chars[today % ip_address_sections[2] % id_chars.size, 1]
res_id[3] = id_chars[today % ip_address_sections[3] % id_chars.size, 1]
res_id[4] = id_chars[today % (ip_address_sections[0] + ip_address_sections[0]) % id_chars.size, 1]
res_id[5] = id_chars[today % (ip_address_sections[1] + ip_address_sections[0]) % id_chars.size, 1]
res_id[6] = id_chars[today % (ip_address_sections[2] + ip_address_sections[0]) % id_chars.size, 1]
res_id[7] = id_chars[today % (ip_address_sections[3] + ip_address_sections[0]) % id_chars.size, 1]
res_id[8] = id_chars[today % (ip_address_sections[1] + ip_address_sections[1]) % id_chars.size, 1]
res_id.to_s
end
def add_link_to_content(content, topic_id)
content = h(content)
content = content.gsub(/\r\n/, "<br>")
content = content.gsub(/\n/, "<br>")
content = content.gsub(/\r/, "<br>")
content = content.gsub(/>>([1-9][0-9]?[0-9]?)/, "<a href=\"/post/list/#{topic_id}/\\1\">>>\\1</a>")
content
end
class PostRange
def initialize(post_range=nil)
@first = 1
@last = 1
parse_range(post_range)
end
def first
@first
end
def last
@last
end
def include_first?
@include_first
end
def from_last?
@from_last
end
private
def parse_range(post_range)
if /^(\d+)?-(\d+)?$/ =~ post_range
@first = $1
@last = $2
@include_first = true
@from_last = false
elsif /^(\d+)n-(\d+)?$/ =~ post_range
@first = $1
@last = $2
@include_first = false
@from_last = false
elsif /^(\d+)$/ =~ post_range
@first = $1
@last = $1
@include_first = false
@from_last = false
elsif /^l(\d+)$/ =~ post_range
@first = 1
@last = $1
@include_first = false
@from_last = true
else
@first = nil
@last = nil
@include_first = true
@from_last = false
end
end
end
end
がっつり来ちゃいましたね。
date_format では、date 型のオブジェクトを受け取って某巨大掲示板っぽいで表示されている形式の日付に変換します。
generate_id では、IP アドレスとレス書き込み日を元に、某巨大掲示板っぽい書き込み ID を生成しています。ここはいろいろ変えて遊んでみてね。
add_link_to_content では、書き込みの中にある >>233 みたいな文字にリンクを付け加えたりします。
PostRange クラスは、レスの範囲を URL に指定したときに、実際何番から何番までのレスを表示するか(first, last)、1番のレスを表示するか(include_first?)、レス番号の大きい方から特定の数だけ表示するのかどうか(from_last?)、を解析します。
某巨大掲示板でいろいろ試してみたのですが、このルールは奥が深くて参りました。
おしまい。次回へ続く
【広告】