FrontPage  Index  Search  Changes  Login

RailsでWikiクローンを作る04

ページ編集画面

DBテーブルの検索

新規作成ページの次は、ページを編集するための edit アクションを作ります。 app/controllers/wiki_controller.rb に以下のようなeditメソッドを作ります。

 def edit
   @page = Page.find_by_name(params[:id]) || Page.new(:name => params[:id])
 end

edit アクションは /wiki/edit/FrontPage のようにページ名を伴って呼び出 されます。前に説明した通り、アクション名の後のFrontPageの部分は ID と 言い、コントローラの中で params[:id] で参照できます。

@page = Page.find_by_name params[:id] で、DBテーブルのnameカラムを params[:id]の値(すなわちページ名)で検索して、最初に見つかった行を @page に代入します。モデルの find_by_カラム名 というクラスメソッドは、 カラムの値が引数で指定した値と一致する行を検索して、最初に見つかったも のを返します。

指定したページが見つからなかったら、新たに Page のインスタンスを生成し、 name 属性に指定のページ名を代入しています。

続いて、対応するビューのテンプレート app/views/wiki/edit.rhtml を作ります。

<% @title = "#{@page.name} の編集" %>
<div class="body">
<%= error_messages_for 'page' %> 
<%= start_form_tag :action => 'update', :id => @page.name %>
  <p><label for="page_title">タイトル</label>
  <%= text_field 'page', 'title'  %></p>
  <p><label for="page_content">内容</label><br/>
  <%= text_area 'page', 'content'  %></p>
  <p><%= check_box 'page', 'freezeflag', {}, true, false %>
  <label for="page_freeze">ページの凍結</label></p>
  <%= submit_tag "保存" %>
<%= end_form_tag %>
</div>

フォームのヘルパーメソッドが何種類か増えていますが、基本的にページの新 規作成のビューと大きな違いはありません。 text_area は textarea のフォー ムを生成するヘルパーメソッドです。 check_box は checkbox タイプの input フォームを生成します。

この段階で、http://localhost:3000/wiki/edit/FrontPage のように、適当に ページ名をつけてブラウザでアクセスすると以下のような画面が現れます。

編集フォーム

そして、保存できるように app/controllers/wiki_controler.rb に update アクションを作ります。

 def update
   @page = Page.find_by_name(params[:id]) || Page.new(:name => params[:id])
   params[:page][:content] = params[:page][:content].gsub(/\r\n/, "\n")
   if @page.update_attributes(params[:page])
     redirect_to :action => 'show', :id => @page.name
   else
     render :action => 'edit'
   end
 end

Page.find_by_name で、params[:id]で指定されるページ名の行を検索します。 そして、content の改行コードを変換した後、update_attributes で行を更新 します。 @page.update_attributes(params[:page]) は、入力フォームで入力 された値に基づき、DBテーブルの既存の行を更新する場合の常套句です。

Last modified:2005/11/27 11:23:59
Keyword(s):
References:[RailsでWikiクローンを作る]