めも帖

「めも帖」代わりにダラダラと書いていったり、めもしたりしているだけです。

実際にやってみよう(2)

疑問点

  • throughってなんだ?
  • created_at desc
  • モデル間のリレーションについては、別にエントリーを用意して理解を深める
  • コントローラで出てくる「include AuthenticatedSystem」以下について(プラグイン?)
  • viewのstrftime("%Y年%m月%d日")

動かしてみてからの課題

  • 前回の(1)とともに、とにかく動かすことを最優先したので、内容の理解に乏しい。一つ一つ次は見てみることにします
  • acts_as_taggableでタグをつけることは出来るかな?というような機能追加

モデル間のリレーションを定義

app/models/page.rbを編集
class Page < ActiveRecord::Base
    has_many :users, :through => :bookmarks
    has_many :bookmarks, :order => "created_at desc"
end
app/models/user.rbを編集

実際にはもっとたくさん色々書いてある。

class User < ActiveRecord::Base
  has_many :pages, :through => :bookmarks
  has_many :bookmarks, :order => "created_at desc"
app/models/bookmark.rbを編集
class Bookmark < ActiveRecord::Base
  belongs_to :user
  belongs_to :page

  validates_uniqueness_of :page_id, :scope => :user_id

バリデーションを定義

app/models/page.rbを編集
class Page < ActiveRecord::Base
    has_many :users, :through => :bookmarks
    has_many :bookmarks, :order => "created_at desc"

    private
    def validate
        begin
            parsed_uri = URI.parse(uri)
            raise unless parsed_uri.host
            raise unless %w(http https).include?(parsed_uri.scheme)
        rescue
            errors.add(:uri, "invalid URI")
        end 
    end 
end

アクセサのオーバライドを定義

app/models/page.rbを編集
class Page < ActiveRecord::Base
    has_many :users, :through => :bookmarks
    has_many :bookmarks, :order => "created_at desc"

    private
    def validate
        begin
            parsed_uri = URI.parse(uri)
            raise unless parsed_uri.host
            raise unless %w(http https).include?(parsed_uri.scheme)
        rescue
            errors.add(:uri, "invalid URI")
        end 
    end

    def title
         self[:title].blank? ? self[:uri] : self[:title]
    end
end

コントローラ作成

pageコントローラの作成
ruby script/generate controller page
app/controllers/page_controller.rbを編集
class PageController < ApplicationController
  include AuthenticatedSystem
  before_filter :login_required

  def show
    @myuser = current_user
    @page = Page.find_by_uri(params[:uri])
  end
end
userコントローラの作成
ruby script/generate controller user
app/controllers/user_controller.rbを編集
class UserController < ApplicationController
  include AuthenticatedSystem
  before_filter :login_required

  def show
    @myuser = current_user
    @user = params[:id].nil? ? @myuser : User.find(params[:id])
  end
end
bookmarkコントローラの作成
ruby script/generate controller bookmark
app/controllers/bookmark_controller.rbを編集
class BookmarkController < ApplicationController
    include AuthenticatedSystem
    before_filter :login_required

    def add
        @myuser = current_user
        @page = Page.find_by_uri(params[:uri]) || Page.new(:uri => params[:uri])
        @page.title = params[:title]
        @bookmark = Bookmark.new
        @bookmark.user = @myuser
        @bookmark.page = @page
        @bookmark.comment = params[:comment]
        if request.post? && (@bookmark.save! rescue false)
            redirect_to :controller => "user", :action => "show", :id => @myuser
        else
            render(:action => "add")
        end 
    end 
end

ビュー作成

pageビューを編集

app/views/page/show.rhtmlを作成

<h1><%= link_to(h(@page.title), h(@page.uri)) %></h1>
<ul>
<% for bookmark in @page.bookmarks -%> 
  <li>
    <%= bookmark.created_at.strftime("%Y年%m月%d日") %>
    <%= link_to(h(bookmark.user.login), :controller => "user", :action => "show", :id => bookmark.user) %>
    <%= h(bookmark.comment) %>
  </li>
<% end -%> 
</ul>
userビューを編集

app/views/user/show.rhtmlを作成

<h1><%= h(@user.login) %>さんのブックマーク</h1>
<ul>
<% for bookmark in @user.bookmarks.find(:all, :include => [:page]) -%> 
  <li>
    <%= bookmark.created_at.strftime("%Y年%m月%d日") %>
    <%= link_to(h(bookmark.page.title), :controller => "page", :action => "show", :uri => bookmark.page.uri) %>
    <%= h(bookmark.comment) %>
  </li>
<% end -%> 
</ul>
bookmarkビューを編集

app/views/bookmark/add.rhtmlを作成

<h1>ブックマークの追加</h1>
<% if request.post? -%>
<%= error_messages_for "page" %>
<%= error_messages_for "bookmark" %>
<% end -%>
<%= form_tag %>
<dl>
  <dt>URI</dt>
  <dd><%= text_field_tag "uri", @page.uri, :size => 40 %></dd>
  <dt>タイトル</dt>
  <dd><%= text_field_tag "title", @page.title, :size => 40 %></dd>
  <dt>コメント</dt>
  <dd><%= text_field_tag "comment", @bookmark.comment, :size => 40 %></dd>
</dl>
<p><%= submit_tag %></p>
<%= end_form_tag %>

動かす

動いた。見た目のカスタマイズはともかく、動く。