« 発売日と号数 | トップページ | 優秀な社員様 »

学習RoR(10)

 前回の問題はしっかりと順序を考えながら直したらすぐに解決できた。

 当初のリストはこう。

def remove_edition
 @edition = Edition.find(params[:id])
 @edition.destroy
 update_now_edition(@edition.item_id)
 flash[:message] = _('edition successfully deleted')
 redirect_to :action => 'show', :id => @edition.item_id
end

 とにかく削除してしまっていたバージョン。update_now_edition は、edition の追加や削除などを行ったときに、最新の edition がどれになるかを調べ、 item の最新 edition を納める now_edition カラムに edition_id を設定しなおす処理。

 で、このままだと edition のない item ができてしまうので、edition がひとつしかないときに削除しないようにしたのが以下。

def remove_edition
 @edition = Edition.find(params[:id])
 now_item_id = @edition.item_id
 begin
  Edition.transaction do
   @edition.destroy
   update_now_edition(@edition.item_id)
  end
 rescue
  flash[:message] = _('last edition at this item. Delete item ?')
  redirect_to :action => 'show', :id => now_item_id
  return
 end
 flash[:message] = _('edition successfully deleted')
 redirect_to :action => 'show', :id => @edition.item_id
end

 先日は transaction の範囲をきちんと理解していなかったのと find メソッドの offset オプションがなんとなくいけそうな気がしてしまい、何やらおかしなことに。

 edition がひとつもなくなってしまうと update_now_edition() のところでエラーになるので、そのときはメッセージを出して削除はせずに戻るようにしている。item_delete として item の削除を用意してあるので、そちらでそっくり削除できるからこれでよかろうと。

 またこのとき、

redirect_to :action => 'show', :id => @edition.item_id

 とすると、@edition.item_id が nil になってしまうようなので、事前に item_id を now_item_id として保存し、

redirect_to :action => 'show', :id => now_item_id

 としている。

Rails のお薦め本

(11)につづく

|
|

« 発売日と号数 | トップページ | 優秀な社員様 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/28835/13125022

この記事へのトラックバック一覧です: 学習RoR(10):

« 発売日と号数 | トップページ | 優秀な社員様 »