0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails session情報削除ボタンの作り方

Posted at

ボタンの記述方法をググった結果

Railsリファレンスより

使い方
button_to(文字列 [, オプション, HTMLオプション]
<%= button_to "削除", { :action => "destroy", :id => @page.id }, :confirm => "本当に削除しますか?", :method => :delete %>

参考例が記述してあったが、:actionや:idが何なのか説明もなく初心者には全く分からない。
button_toでgetメソッドを指定しようとしたら手間取った
button_to ボタンでリンク rails

などを参考に、button_toはlink_toは基本的に使い方は同じだと理解。

button_to 'リンク',パス,アクション指定

Railsにおけるボタンの記述例

ここではセッションに保存した情報を削除する
rails routes の cart delete には /cart/:id とあり idを要求されているのでパスの
引数に指定しなければならない。
metod: :deleteは削除する際のおまじない的なもので、これを記述したことにより
コントローラーの方でdestroyアクションを定義することになる。

<%= button_to "Clear Cart", cart_path(session[:cart]), method: :delete%>

controllerの記述

session削除には複数の記述方法があるが、ここではreset_sessionを用いています。
session情報を削除した後は、元のページに戻って欲しいのでredirect_toでパスを指定

def destroy
    reset_session
    redirect_to cart_index_path
  end

実行結果

Started DELETE "/cart/6" for 127.0.0.1 at 2018-08-14 20:45:01 +0900
Processing by CartController#destroy as HTML
  Parameters: {"authenticity_token"=>"dkOpjA4gWeHzVhsgvbC06PmGPkdsvy9C1I4XZ2pObZYf0IbtDRG6oGiUKOffE+lvtjyyjkknAoKgImK3OgMrrA==", "id"=>"6"}
Redirected to http://localhost:3000/cart
Completed 302 Found in 1ms (ActiveRecord: 0.0ms)


Started GET "/cart" for 127.0.0.1 at 2018-08-14 20:45:01 +0900
Processing by CartController#index as HTML
  Rendering cart/index.html.erb within layouts/application
  Rendered cart/index.html.erb within layouts/application (5.3ms)
Completed 500 Internal Server Error in 15ms (ActiveRecord: 0.0ms)

ActionView::Template::Error (No route matches {:action=>"show", :controller=>"cart", :id=>nil}, missing required keys: [:id]):
    17: <br>
    18: <% end %>
    19: 
    20: <%= button_to "Clear Cart", cart_path(session[:cart]), method: :delete%><br>
    21: <%= link_to 'Check Products', root_path %>

missing required keys: [:id] :idが見つかりませんとエラーを吐く。
ブラウザではなくterminalにてlogを確認するとdeleteアクションを実行した後、redirectに設定したパスに戻る際のgetアクションでエラーが生じている。
戻った先のページ内にて別リンクに飛ぶパスの記述がこのままではダメですよーとのこと。
少し考えた後に、削除ボタンを実行した為にsession[:cart]が空になっているので、リンクに指定しているcart_path(session[:cart])の引数がないからエラーが起きていたのだと理解。

完成形ボタンコード

<% if session[:cart] != nil %>
<%= button_to "Clear Cart", cart_path(session[:cart]), method: :delete%><br>
<% end %>

session[:cart]が空でない時のみに削除ボタンを出現させるように条件式を記述したら無事解決。
つくづくRails gで生成されたコードやそれに加える変更は全てがおまじないに見えるので、paizaスキルチェックでrubyのコードを書いてた頃とは違い自分が何をしているかが分からない感覚が悲しい・・。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?