学習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 のお薦め本 】
| 固定リンク
コメント