2017.05 «  - - - - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 - » 2017.07
TOP > 掲示板を作ってみる・その6【ヘルパを作る】

 ← 掲示板を作ってみる・その7【スレッド用コントローラを編集】 | TOP | 掲示板を作ってみる・その5【コントローラを生成】

スポンサーサイト 

--年--月--日 (--)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


【広告】

[--.--.--(--) --:--] スポンサー広告 | Trackback(-) | Comment(-)
↑TOPへ

掲示板を作ってみる・その6【ヘルパを作る】 

2008年08月06日 ()

掲示板を作ってみる・その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(/&gt;&gt;([1-9][0-9]?[0-9]?)/, "<a href=\"/post/list/#{topic_id}/\\1\">&gt;&gt;\\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?)、を解析します。
某巨大掲示板でいろいろ試してみたのですが、このルールは奥が深くて参りました。


おしまい。次回へ続く


【広告】

[2008.08.06(Wed) 11:23] 掲示板アプリTrackback(0) | Comments(0)
↑TOPへ

 ← 掲示板を作ってみる・その7【スレッド用コントローラを編集】 | TOP | 掲示板を作ってみる・その5【コントローラを生成】

COMMENT

COMMENT POST















管理者にだけ表示

 ← 掲示板を作ってみる・その7【スレッド用コントローラを編集】 | TOP | 掲示板を作ってみる・その5【コントローラを生成】
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。