初めてのruby開発 - 編集・削除開発編
前回は、登録フォームの作成、確認画面、登録処理、バリデーションを行い、
登録した詳細情報を取得して、詳細ページを作成しました。
今回は、登録した情報を編集(UPDATE)と削除(DELETE)を行おうと思います。
初歩的な処理なので、サクサクやってしまおうかと思いますw
目次を作成しました!以下のページへ!
初めてのruby開発 - 目次 - Program LOG
参考にしたサイト
#06 rails db/rails consoleを使おう | Ruby on Rails 4入門 - プログラミングならドットインストール
Railsドキュメント
Railsで確認画面の基本 - 篳篥日記
Ruby on Railsあれこれ/とりあえず基本的なアプリを作成しましょう - 笑猫酒家
【rails】create/update時に特有のvalidationの実装 - 〜 odalog 〜
Rails - 状況によってsave時に実行するバリデーションを切り替える - Qiita
編集画面の作成
まず、トップページの一覧から編集ページへ遷移します。
その際IDを取得できるようにURLに記載してあります。
そのIDを用いて、初期値を設定し登録時と同じバリデートを行い、確認ページの表示。
その後、編集処理を実行できるようにしたいと思います。
まずは、前回と同様に、bbs_controller.rbファイルを編集していきたいと思います。
#編集画面 def update @bbsitem = Bbs.find(params[:id]) if session[:update] @bbsitem = Bbs.new session[:update] @bbsitem.id = params[:id] end end # 確認画面 def update_confirm session[:update] = bbs_params @bbsitem = Bbs.new session[:update] @bbsitem.id = params[:id] render :action => :update unless(@bbsitem.valid?) end
ほとんど前回と変わりませんがw
基本的には、初期値部分を変えているくらいでしょうか。。。w
ビューに関しては、以下のようにしました。
<%= form_for @bbsitem, :url => {:action => "update_confirm"}, :method => :patch do |f| %> <%= render :partial =>'createform', locals: { f: f } %> <%= f.submit:編集 %> <% end %>
登録フォームと編集フォームに違いが無いので、パーシャル初体験w
まぁ、phpのインクルードとどう違うのかよく分かりませんw
手順としては、まず、create.html.erbファイルに書かれているフォーム部分のコードを
「_createform.html.erb」という形で保存しました。
そして、登録のときのフォームも以下のようにしました。
<%= form_for @bbsitem, :url => {:action => "create_confirm"} do |f| %> <%= render :partial =>'createform', locals: { f: f } %> <%= f.submit:登録 %> <% end %>
Ruby On Railsには、2回同じコードは書かないっていう規約があるそうです。
僕もPHPの頃からよく重複するコードがある場合には、インクルードしまくる人だったので、
あんまり気にしていなかったんですが、そうするようにしましょう!
編集処理の実行
さて、確認画面までいきましたので、保存処理を行いたいと思います。
正直に言うと。。。。ちょっとばかりハマりましたw
だって・・・ドットインストールだと確認画面が無いんだもん!w
さて、まずはコントローラーから!
# 保存実行 def update_complete @bbsitem = Bbs.find(params[:id]) if @bbsitem.update_attributes(session[:update]) session[:update] = nil else render :action => :update end end
「update_attributes」こいつ神!w
マジで見つけるまで全然うまくいかんかったw
まぁ、コードを見るだけでは全然余裕な感じなんだが。。。w
あれですね、これ、Railsの色んなメソッドを知っておかないと、簡単にハマりますなw
まぁ、調べればすぐに分かるのでいいんですが!
さて、さらーっと流してしまいましたが、これ実はpatchメソッドで処理しているようです。
まぁ、formのhiddenに入っていたので、実際には違うのかもしれませんが。。。
jQueryでも使わないと実装するのが難しかったpatchメソッドがラクショー!w
いいですねこれ・・・。
次は、CRUDの最後になります。「delete」削除処理を作成したいと思います。
削除確認画面の作成
流れとしては、削除キーを入力して、正解だったら削除できるって仕組みにしたいと思います。
バリデーションが条件付になるので、そこらへんが焦点かと!
まずは、削除確認画面を作成していきます。
まずはコントローラーから修正していきましょう。
#削除確認ページ def delete @bbsitem = Bbs.find(params[:id]) end #削除実行 def delete_complete @bbsitem = Bbs.find(params[:id]) if @bbsitem[:deletepwd] == params[:bbs][:deletepwd] @bbsitem.destroy redirect_to root_path end end
次に、delete.html.erbを作成します。
<%= @bbsitem.title %>を削除します。<br> よろしいですか?<br> <%= link_to "[戻る]", root_path %><br> <br> <%= render :partial =>'delete', locals: { bbsitem: @bbsitem } %>
さらに、エラーが起きた際の処理用に「delete_complete.html」を作成しました。
本来なら、必要ないのですが、今回は特別に・・・w
<%= @bbsitem.title %>を削除します。<br> よろしいですか?<br> <%= link_to "[戻る]", root_path %><br> <br> 削除キーが間違っているため削除できませんでした。<br> <%= render :partial =>'delete', locals: { bbsitem: @bbsitem } %>
また、実装の際は、パーシャルを使用して、フォームの部分を外出しにしました。
<%= form_for @bbsitem, :url => {:action => "delete_complete"}, :method => :delete do |f| %> <%= f.password_field :deletepwd_confirmation %> <%= f.submit:はい %> <% end %>
一応エラーチェックを行い、条件に見合った場合、削除っていう形は完成したんですが、
どうしても、削除キーチェックのバリデーションがモデルでは無く、
コントローラーにいるのが気持ち悪くて、丸1日調査したんですが、いい方法が見当たらなく。。。
こんな形式のコーディングになってしまいました。。。ハイ。
んで、今はひたすら書いていくべきだと、かっこ悪いとは思いますが、こんなコードにしちゃいました。
まぁ、今回までで、取り合えずCRUDは出来ました!
ひとまずは目標達成ということで!本当は、本当は返信機能や、ユーザーログイン機能等を
作ろうと思ったんですが、ハマりまくりでGWを過ごしてしまいした。。。
今度は機能をもっと略式にして実装ポイントだけ追いかけていこうと思います。
今後実装してみようと思う内容
- ページング機能
- cokkieを使ってみる
- ActiveRecordで複数のテーブルを操作する
- 色んなライブラリを使用してみる。
- ユーザーログイン機能
- メール送信
- 画像のアップロード
使用環境
- ホストOS: Windows7 x64
- VirtualBox: 4.3.10
- Vagrant: 1.5.2
- ゲストOS: CentOS6.4 x64
- Ruby : 2.0.0-p451
- Ruby on Rails : 4.1.0
- passenger : 4.0.41
- apache : 2.2.15
- NetBeans IDE 8.0