質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

2839閲覧

Rails: ストロングパラメーター から送られてきた値で条件分岐を行いたい

GonshibaN

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/05/22 18:10

前提・実現したいこと
プログラミング初学者です。
Ruby on Railsでブックマーク管理アプリを作成しています。
今回、ブックマーク一覧画面からチェックボックスで選択したブックマーク(1個〜複数個)をまとめて配列でコントローラに送る機能を実装しました。

チェックボックスにチェックが何もない時と正しくチェックされている時の条件分岐をコントローラーに値が送られてきた時に行いたいです。
しかし、どの様に書けば良いのか分かりません。(送られてくる値の変数名)
この場合どの様にコードを書けば良いのかご教授いただけないでしょうか?

該当のソースコード
index.html.erb

<%= form_with model: @contents, url: contents_path, method: :delete, local: true do |f| %> <% @contents.each do |content| %> <% @count += 1%> <tr> <td>   <%= f.check_box :content_ids, {type: 'checkbox', class: 'checkbox-select', id: "checkbox#{@count}", multiple: true, include_hidden: false}, content.id %> <%= f.label :'', for: "checkbox#{@count}",class: 'select-label' %> </td> <td> <%= link_to content.name, content %> </td> <td> <%= link_to 'URL', content.url %> </td> <%#概要は空白の場合の処理も記載%> <td><%= link_to content.description.blank? ? 'None' : content.description, content %></td> <%#カテゴリーは空白の場合の処理も記載%>  <td><%= link_to content.category.blank? ? 'None' : content.category, content %></td>  <td><%= link_to content.updated_at.to_s(:datetime_jp), content %></td>  </tr>     <% end %> <%= f.button select_destroy_path, method: :delete, data_toggle: 'tooltip', data_placement: 'topdo', title: '削除',data: {confirm: "ブックマークを削除します"},class: 'select_submit' do %> <%= embedded_svg('delete.svg', class: "delete")%> <% end %> <% end %>

contents_controller.rb

def select_destroy select_content_params.each{|id| content = Content.find(id) content.destroy } redirect_to contents_url, notice: "ブックマークを削除しました" end private def select_content_params ids = params.require(:content).permit(content_ids: []) ids.values[0] end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

結論:ストロングパラメーターはシンプルに本来の役割を担ってもらい
アクションにて条件分岐をさせた。

ストロングパタメーター

def select_content_params ids = params.require(:content).permit(content_ids: []) ids.values[0] end

ここはシンプルに処理をこなしてもらう。
しかしその前に、チェックボックスのオプションを切る
変更前

 <%= f.check_box :content_ids, {type: 'checkbox', class: 'checkbox-select', id: "checkbox#{@count}", multiple: true, include_hidden: false}, content.id %>

変更後

 <%= f.check_box :content_ids, {type: 'checkbox', class: 'checkbox-select', id: "checkbox#{@count}", multiple: true}, content.id %>

include_hidden: falseを消すことにより、チェックボックスが入っていない場合もコントローラに送られる配列の中に"0"として値が送られる。
例:[0,0,1,0]
※本来であれば
チェック有り→1
チェックなし→0
である。
今回は、idとしている。

その後、コントローラにて0しかない場合(チェックなし)の条件と
チェックありの場合の条件を書いた。

contents_controller.rb

def select_destroy if select_content_params.uniq.count == 1 redirect_to contents_url, notice: "削除項目を選択してください" else select = [] select_content_params.map{|n| select << n select.delete("0") } select.each{|id| content = Content.find(id) content.destroy } redirect_to contents_url, notice: "ブックマークを削除しました" end end

投稿2020/05/23 16:55

GonshibaN

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問