ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Ruby勉強会@広島コミュのHowToReuseEditViewsForNewViews

  • mixiチェック
  • このエントリーをはてなブックマークに追加
【HowToReuseEditViewsForNewViews】

ビューを再利用する

たいていのアプリケーションで、編集や作成のビューの基本的な部分は同じです。。もしモデルを変更したり新しい属性を追加した場合、煩わしくなります。編集と作成の両方を変更しないといけません。

これはDRY原則を犯してます。Railsではモデルの作成ビューに編集ビューを簡単に再利用することでこの問題を解決することができます。

まずビューのモードを保持する変数を新しく作成します。editモードとnewモードの2つのモードでメソッド呼び出しで判断させます。モードに依存してフォームを特定のコントローラのメソッドにpostします。

ビューを下記のように修正します。

<% if @mode == "edit" -%>
 <%= start_form_tag :action=> "edit", :id => @member.id %>
 <%= hidden_field "member", "id" %>
<% else -%>
 <%= start_form_tag :action=> "new" %>
<% end -%>

これらのモードを処理させるようコントローラのメソッドを実装します。

def edit
  @member = Member.find(@params['id'])
  @mode = "edit"
  # will use the "edit.rhtml" template by default
end  

def new
  @member = Member.new()
  @mode = "new"
  render_action "edit"
end

トリッキーな部分はnewメソッドにあるrender_action "edit"の部分です。これはedit.rhmtlテンプレートを使ってデフォルトのnew.rhtmlの代わりにレンダリングさせます。
このようにしてテンプレートを再利用することができます。


---------------- 翻訳者より: ------------------------


こんなんで分かるかよ!実例します。

MySQLのtestデータベースを使うことにします。

development:
 adapter: mysql
 database: test
 username:
 password:
 socket: /var/run/mysqld/mysqld.sock

マイグレーションで、Memberテーブルを作成

$ ./script/generate migration create_table_member
   create db/migrate
   create db/migrate/001_create_table_member.rb

 1 class CreateTableMember < ActiveRecord::Migration
 2  def self.up
 3   create_table(:members) do |t|
 4    t.column(:username, :string)
 5    t.column(:password, :string)
 6   end
 7  end
 8
 9  def self.down
10   drop_table(:members)
11  end
12 end

$ rake migrate

scaffoldでAdminコントローラとMemberモデルを作る

$ ./script/generate scaffold Member Admin
   exists app/controllers/
   exists app/helpers/
   exists app/views/admin
   exists test/functional/
 dependency model
   exists  app/models/
   exists  test/unit/
   exists  test/fixtures/

コントローラをHowtoと同じに編集

def edit
  @member = Member.find(@params['id'])
  @mode = "edit"
  # will use the "edit.rhtml" template by default
end  

def new
  @member = Member.new()
  @mode = "new"
  render_action "edit"
end

edit.rhtmlのビューを編集

 1 <% if @mode == "edit" -%>
 2  <h1>Editing member</h1>
 3  <%= start_form_tag :action => 'update', :id => @member %>
 4   <%= render :partial => 'form' %>
 5   <%= submit_tag 'Edit' %>
 6 <% else -%>
 7  <h1>New member</h1>
 8  <%= start_form_tag :action => 'new' %>
 9   <%= render :partial => 'form' %>
10   <%= submit_tag 'Create' %>
11 <% end %>
12  <%= end_form_tag %>
13
14 <% if @mode == "edit" -%>
15 <%= link_to 'Show', :action => 'show', :id => @member %> |
16 <% end %>
17 <%= link_to 'Back', :action => 'list' %>

いらないビューを削除

$ rm app/views/admin/new.rhtml

これでOKです。丁寧に書いて欲しいですよね。Howtoだからあっさりしてるのか?

--------------------------------------------------------

翻訳者より:続きは保留

コメント(0)

mixiユーザー
ログインしてコメントしよう!

Ruby勉強会@広島 更新情報

Ruby勉強会@広島のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング