前提・実現したいこと
Ruby on Rails
ActiveHashモデルのデータを用いてcollection_check_boxesで選択した複数の値を保存させたいです。
機能の目的は、自宅にある調味料をユーザーデータとして登録させたいというものです。
調味料のデータは頻繁に変わるものではないためActiveHashを用いて実装しようとしています。
発生している問題・エラーメッセージ
エラーメッセージは出ずに、createアクションで定義した保存できた場合、の条件分岐処理としてトップページに戻っても保存はできていません。
MySQLの調味料テーブル(seasonings)を確認すると、user_idはちゃんと紐付いた状態でレコードは追加されているのですが、collection_check_boxesで選択した値はsalt_sugar_idカラムに保存されずNULLになっています。
試したこと
crateアクションをbinding.pryで止めてターミナルログを確認し、salt_sugar_idカラムのパラメーターに問題があるとわかり、以下のことを試しました。
- salt_sugar_idカラムに関係する記述すべてに誤字脱字はないか確認しました
- バリデーションでnumericality: { other_than: 1 } をしている状態で、salt_sugar_idの中に空白""の値も入っているのも原因かと推測し、SaltSugarモデルself.dataのデフォルト部分を削除してみました
- 複数の値を保存させたいことから、belongs_toのアソシエーションも間違っている可能性を考え、has_manyで検証しましたがNoMethodErrorになります。
- permit!メソッドにしてみました。ターミナルログにはパラメーターのエラー文は出なくなったのですが、MySQLに値は保存されず保存できなかったときのページ遷移になります。
以下の情報以外に必要次項等ありましたらすぐに補足させていただきます。
直接的ではなくても、考え方やヒントだけでもご教示いただけたら嬉しいです。
宜しくお願い致します。
Started POST "/seasonings" for ::1 at Processing by SeasoningsController#create as HTML Parameters: {"authenticity_token"=>"HgwBaS0yU0S6Qf1kCr3IQ/k2X0OK9KlIxBz237TYrXLEjll3/02oSDL6qsJqGasb3XOUHcmhvX/ct8DegVOPPQ==", "seasoning"=>{"salt_sugar_id"=>["", "7", "8"]}, "commit"=>"登録"} Unpermitted parameter: :salt_sugar_id User Load (0.2ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/controllers/seasonings_controller.rb:25:in `seasoning_params' (0.2ms) BEGIN ↳ app/controllers/seasonings_controller.rb:13:in `create' User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1 ↳ app/controllers/seasonings_controller.rb:13:in `create' (0.2ms) ROLLBACK ↳ app/controllers/seasonings_controller.rb:13:in `create' Rendering seasonings/new.html.erb within layouts/application Rendered shared/_header.html.erb (Duration: 0.2ms | Allocations: 133) Rendered shared/_footer.html.erb (Duration: 0.0ms | Allocations: 5) Rendered seasonings/new.html.erb within layouts/application (Duration: 1.6ms | Allocations: 1372) [Webpacker] Everything's up-to-date. Nothing to do Completed 200 OK in 53ms (Views: 23.3ms | ActiveRecord: 1.0ms | Allocations: 36486)
該当のソースコード
カラム名はsalt_sugarのみ抜粋し他は省略させていただいてます
config/routes.rb
ruby
1Rails.application.routes.draw do 2 devise_for :users 3 root to: 'seasonings#index' 4 get 'rakuten_search' => 'seasonings#index' 5 resources :seasonings, only:[:index, :new, :create] 6 resources :users, only:[:show] 7end
app/controllers/seasonings_controller.rb
ruby
1class SeasoningsController < ApplicationController 2 3 def index 4 @categories = RakutenWebService::Recipe.large_categories 5 @recipes = @categories.first.ranking 6 end 7 8 def new 9 @seasoning = Seasoning.new 10 end 11 12 def create 13 @seasoning = Seasoning.create(seasoning_params) 14 if @seasoning.save 15 binding.pry 16 redirect_to action: :index 17 else 18 render :new 19 end 20 end 21 22 private 23 24 def seasoning_params 25 params.require(:seasoning).permit(:salt_sugar_id).merge(user_id: current_user.id) 26 end 27 28end
app/models/seasoning.rb
ruby
1class Seasoning < ApplicationRecord 2 belongs_to :user 3 4 extend ActiveHash::Associations::ActiveRecordExtensions 5 belongs_to_active_hash :salt_sugar 6 7 validates :salt_sugar_id, numericality: { other_than: 1 } 8 9end
app/models/user.rb
ruby
1class User < ApplicationRecord 2 devise :database_authenticatable, :registerable, 3 :recoverable, :rememberable, :validatable 4 5 has_one :seasoning 6 has_one_attached :image 7 8 with_options presence: true do 9 validates :nickname 10 validates :password, length: { minimum: 8 }, format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i } 11 end 12end
app/models/salt_sugar.rb
ActiveHash model
ruby
1class SaltSugar < ActiveHash::Base 2 self.data = [ 3 # { id: 1, name: '--' }, 4 { id: 2, name: '塩' }, 5 { id: 3, name: '岩塩' }, 6 { id: 4, name: '藻塩' }, 7 { id: 5, name: '白砂糖' }, 8 { id: 6, name: '黒糖' }, 9 { id: 7, name: 'きび砂糖' }, 10 { id: 8, name: 'オリゴ糖' }, 11 ] 12 13 include ActiveHash::Associations 14 has_many :seasonings 15 16end
app/seasonings/new.html.rb
ruby
1<div id='home', class='big-bg'> 2 <%= render 'shared/header' %> 3 4 <div class='main-content'> 5 <div class='form-box'> 6 <div class='list'> 7 <h3><%= link_to "uchino_aji", "/", class: 'main-subtitle' %></h3><br /> 8 <h2>うちの調味料登録</h2> 9 10 <%= form_with model: @seasoning, url: seasonings_path, method: :post, local: true do |f| %> 11 12 <div class="form"> 13 <span class='optional'>(任意)</span> 14 <%= f.label "塩・砂糖", class: 'form-label' %><br /> 15 <%= f.collection_check_boxes(:salt_sugar_id, SaltSugar.all, :id, :name, {}, {class: 'check_box', id:'salt-sugar'}) %> 16 </div> 17 18 <div class="actions"> 19 <%= f.submit "登録", class: 'recipe-detail-btn' %> 20 </div> 21 <% end %> 22 23 </div> 24 </div> 25 </div> 26</div> 27<%= render 'shared/footer' %>
db/migrate/XXXXX_craate_seasonings.rb
ruby
1class CreateSeasonings < ActiveRecord::Migration[6.0] 2 def change 3 create_table :seasonings do |t| 4 t.references :user, null:false, foreign_key: true 5 t.integer :salt_sugar_id 6 t.timestamps 7 end 8 end 9end
補足情報(FW/ツールのバージョンなど)
GitHub(エラー部分は反映できていない状態です)
rails 6.0.0
mysql2 0.5.3
gem 'active_hash'
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/12/06 00:54
退会済みユーザー
2020/12/06 10:53
2020/12/06 11:46
退会済みユーザー
2020/12/06 13:26