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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

604閲覧

チェックボックスでboolean型のカラムの値を変更したい

Rain_50

総合スコア1

Ruby

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

Ruby on Rails

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

1グッド

0クリップ

投稿2021/04/14 10:07

環境

  • MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)
  • OS:Catalina ver:10.15.7(19H2)
  • Rails 6.0.3.4
  • ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19]

やりたいこと

  • チェックボックスのチェック有無でauthenticationカラムの値を変更したい

経緯

  • storesテーブルにauthenticationカラム(boolean型)を追加
  • チェックボックスにauthenticationカラムを与えて作成(update)を押下

ruby

1_form.html.erb 2<%= form_with(model: @store, local: true) do |f| %> 3〜中略〜 4 <%= f.label "認証マークを与える" %> 5 <%= f.check_box :authentication %> 6 <%# f.check_box(:object_name,{:checked=>true},"チェック時の値","未チェック時の値") %> 7 <%= f.submit "作成" %> 8<% end %>
  • binding.pryでparamsを確認してもチェックした場合は:authenticationが0→1に変わっていることを確認

ruby

1[1] pry(#<StoresController>)> params 2=> <ActionController::Parameters {"_method"=>"patch", "authenticity_token"=>"~~~", "store"=><ActionController::Parameters {"name"=>"test", "category_id"=>"3", "detail"=>"aaa", "authentication"=>"1"} permitted: false>, "commit"=>"作成", "controller"=>"stores", "action"=>"update", "id"=>"26"} permitted: false>
  • SequelProでレコードを確認すると:authenticationの値は0のままとなっている
  • コントローラーで:authenticationはpermitしている

ruby

1class Admin::StoresController < ApplicationController 2 before_action :set_store, only: [:edit, :update, :destroy] 3〜中略〜 4def update 5 if @store.update(store_params) 6 redirect_to store_path 7 return 8 end 9 render :edit 10 flash[:notice]="情報を入力していない箇所があります。" 11end 12 13 private 14 def store_params 15 params.require(:store).permit(:name, :images, :category_id, :detail, :authentication).merge(user_id: current_user.id) 16 end 17 18 def set_store 19 @store = Store.find(params[:id]) 20 end 21end
  • 必要な情報があれば教えて下さい。
shinoharat👍を押しています

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

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

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

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

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

guest

回答1

0

自己解決

原因

  • user用cotrollerのstores#showでのbefore_actionで

:authenticationがpermitされていなかった

ruby

1<> 2params.require(:store).permit(:name, :images, :category_id, :detail).merge(user_id: current_user.id) 3<> 4params.require(:store).permit(:name, :images, :category_id, :detail, :authentication).merge(user_id: current_user.id)

対処

  • stores_controller.rbのpermit対象に:authenticationを追加
  • SequelProでも対象レコードの:authenticationの変更が反映されたことを確認

PS

  • 全てのViewファイルをuser,admin用に作成していればよかったのかもしれない。
  • 元々controllerをuserとadminに分けていたが、

 ViewやRootingを最少のファイルで構成していたことが本件の原因。(以下にフロー)
1.adminでログイン後store#indexに移動してstores#showにアクセス
↑このタイミングだとuser用controllerのbefore_actionに:authenticationがpermitされていない。
そのため、次項のedit_admin_storeで:authenticationの変更ができない。
2.adminでログインしている場合のみ管理者用の編集リンク(edit_admin_store)が
表示されるのでedit_admin_storeにアクセス
↑このタイミングでadmin用controllerのアクションが実行される
(admin用のcontrollerだと:authenticationがpermit済み)
3.”1”の時点で:authenticationがpermitされていないのでedit_admin_storeでの
:authenticationの変更が反映できない。

投稿2021/04/15 02:27

Rain_50

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問