目次

2009年1月23日金曜日

Ruby on Rails チュートリアル(2) 〜投稿、編集、削除まで〜

前回作ったものを元に、新しいユーザーを追加したり、情報を編集したり、削除したりできるようにします。

さっそく作ろう、という前にちょっとお話。
データベースの基本操作はCRUD/Create, Read, Update, Deleteの4つから成り立っているそうです。この4つをRailsで実現するには7つのアクションを用意するのが一般的。
7つ・・・・・index, show, new, edit, create, update, destroy
なんとなく名前から、それぞれがどんな役割を担うか分かると思います。
それでは「user_controller.rb」の編集から。


class UsersController < ApplicationController
def index
@users = User.find(:all)
end

def show
@user = User.find(params[:id])
end
#indexとshowは前回と同じです。
def new
@user = User.new
end
 #モデルクラス名.newで新しいレコード作成
def edit
@user = User.find(params[:id])
end
#showと同じ
#新規作成用フォーム
def create
@user = User.new(params[:user])#上のnewでの値を受け取っています。
if@user.save
flash[:notice] = '新しいユーザーが追加されました!'
redirect_to :action => 'show' , :id => @user #処理が終わったら新規作成したユーザーのshow/(id)へ
else
render :action => 'new'
end
end
 #flashで、画面に処理表示の結果を出力することができます。
def update
@user = User.find(params[:id])
@user.attributes = params[:user]
@user.save
if@user.save
flash[:notice] = '情報が更新されました'
redirect_to :action => 'show' , :id => @user#処理が終わったら,更新したページ=show/(id)へ
else
render :action => 'edit'

end
end
 #editの値をうけとってupdateしています。
def destroy
@user = User.find(params[:id])
@user.destroy
flash[:notice] = '削除しました'
redirect_to :action => 'index'#処理が終わったらindexへ
end

end



7つのアクションを編集しました。
次はそれぞれのViewを編集していきます。

まずはindex.rhtml.erb


<h1>Test003: Users : indexページ</h1>

<div class ="notice"><%= h(flash[:notice])%></div>#Flashによる、処理結果の表示
<p><%= link_to('新規ユーザー作成', :action => 'new')%></p>


<% @users.each do |user| -%>
<li>
<%= link_to(h(user.user_name), :action => 'show', :id => user.id)%>
<%= link_to('編集', :action => 'edit', :id => user.id)%>
<%= link_to('削除', {:action => 'destroy', :id => user.id},
{:method => :post, :confirm => '本当に削除しますか?'})%>

</li>
<% end -%>





次に、edit.rhtml.erb


<h1>Members#edit#ユーザーデータを編集する</h1>

<% form_for :user, @user,
:url=>{:action => 'update', :id => @user} do |form| %>

<p>名前: <%=form.text_field :user_name, :size => 16 %> </p>
<p>曲: <%=form.text_field :listening_song, :size => 16 %> </p>
<p>メッセージ:<br /><%=form.text_area :message, :colse =>40, :rows => 3%> </p>

<p>
<%= form.submit '更新' %>
</p>
<% end %>
<p><%= link_to('一覧へ戻る', :action => 'index') %></p>




次はnew.rhtml.erb


<h1>Users#new#新しいユーザーを作る</h1>

<% form_for :user, @user,
:url=>{:action => 'create'} do |form| %>

<p>名前: <%=form.text_field :user_name, :size => 16 %> </p>
<p>曲: <%=form.text_field :listening_song, :size => 16 %> </p>
<p>メッセージ:<br /><%=form.text_area :message, :colse =>40, :rows => 3%> </p>

<p>
<%= form.submit 'Create' %>
</p>
<% end %>
<p><%= link_to('一覧へ戻る', :action => 'index') %></p>




これで完成。
私がつまずいていたのは
form_for
の記述方法。URL => 'アクション名'は、editはupdate/newはcreateになります。

1 件のコメント:

llby さんのコメント...

updateの時に、@user.saveとやって
その後に、if @user.saveとやると
2回SQlが発行されると思います。