実際にやってみよう(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 %>
動かす
動いた。見た目のカスタマイズはともかく、動く。