taiti101112 / portfolio

0 stars 0 forks source link

質問 #85

Open taiti101112 opened 1 month ago

taiti101112 commented 1 month ago

[Rails]大変便利なFormオブジェクトはご存知でしょうか?

[【備忘録】Formオブジェクトについて] (https://zenn.dev/adverdest/articles/form_object_article)

Railsで #update のできるFormObjectを作る

以下は「Unpermitted parameters」が出るエラーに対してのチャットGPTの回答になります。

business_hours_attributes パラメータが許可されていないため、未許可のパラメータのエラ> ーが発生しています。params のネストされた属性を許可するための方法について見直して > みましょう。

まず、Admin::ShopsController の shop_params メソッドを確認し、 business_hours_attributes を適切に許可するように修正します。以下に修正例を示します。

Admin::ShopsController
ruby
コードをコピーする
class Admin::ShopsController < ApplicationController
  before_action :authenticate_admin!
  before_action :set_shop, only: [:show, :edit, :update, :destroy]

  # その他のアクション

  private

  def shop_params
    params.require(:shop_business_hour_form).permit(
      :shop_name, :address, :phone_number, :duel_space_available, 
      :opening_hours, :official_hp, :twitter, :instagram, :tag_list,
      business_hours_attributes: [
        :id, :day_of_week, :opening_time, :closing_time, :_destroy
      ]
    )
  end
end

このコードでは、business_hours_attributes の全ての関連属性(id, day_of_week, opening_time, closing_time, _destroy)を許可しています。

次に、shop_business_hour_form.rb 内での accepts_nested_attributes_for が正しく設定 されているかを確認します。これにより、ネストされた属性の保存が可能になります。

ShopBusinessHourForm
ruby
コードをコピーする
class ShopBusinessHourForm
  include ActiveModel::Model
  include ActiveModel::Attributes
  include ActiveModel::Validations

  attr_accessor :shop_name, :address, :phone_number, :duel_space_available,
                :opening_hours, :official_hp, :twitter, :instagram, :tag_list,
                :user_id, :latitude, :longitude

  validates :shop_name, presence: true

  def save
    return false unless valid?

    ActiveRecord::Base.transaction do
      shop = Shop.create!(
        name: shop_name,
        address: address,
        phone_number: phone_number,
        duel_space_available: duel_space_available,
        opening_hours: opening_hours,
        official_hp: official_hp,
        twitter: twitter,
        instagram: instagram,
        latitude: latitude,
        longitude: longitude,
        user_id: user_id
      )

      # BusinessHour の保存処理を追加
      business_hours.each do |bh|
        shop.business_hours.create!(
          day_of_week: bh[:day_of_week],
          opening_time: bh[:opening_time],
          closing_time: bh[:closing_time]
        )
      end
    end
    true
  end

  def business_hours
    @business_hours ||= []
  end

  def business_hours_attributes=(attributes)
    attributes.each do |i, business_hour_params|
      business_hours << BusinessHour.new(business_hour_params)
    end
  end
end

これで、ネストされた属性の処理が正しく行われ、フォームから送信されたデータを許可し> て保存できるようになります。

この修正を行った後、もう一度フォームを送信して確認してください。エラーが解消される はずです。

# app/controllers/admin/shops_controller.rb
module Admin
  class ShopsController < ApplicationController
    before_action :authenticate_admin!
    before_action :set_shop, only: [:show, :edit, :update, :destroy, :edit_hours, :update_hours]
    before_action :set_is_admin

    def index
      @q = Shop.ransack(params[:q])
      if params[:q].present?
        @shops = @q.result(distinct: true)
      else
        @shops = Shop.all
      end

      if params[:tag_name]
        @shops = @shops.tagged_with(params[:tag_name])
      end
    end

    def show
      @tags = @shop.tag_counts_on(:tags)
    end

    def new
      @shop_business_hour_form = ShopBusinessHourForm.new
      @form_url = admin_shops_path
      @form_method = :post
    end

    def edit
      shop_params = @shop.attributes.symbolize_keys.slice(*ShopBusinessHourForm::ATTRIBUTES)
      shop_params[:tag_list] = @shop.tag_list.join(",") if @shop.tag_list.present?
      @shop_business_hour_form = ShopBusinessHourForm.new(shop_params, @shop)
      @form_url = admin_shop_path(@shop)
      @form_method = :patch
    end

    def create
      @shop_business_hour_form = ShopBusinessHourForm.new(shop_business_hour_form_params)
      @shop_business_hour_form.user_id = current_user.id # 現在のユーザーのIDを設定
      @form_url = admin_shops_path
      @form_method = :post
      if @shop_business_hour_form.save
        redirect_to [:admin, Shop.find_by(name: @shop_business_hour_form.shop_name)], notice: 'Shop and business hours were successfully created.'
      else
        Rails.logger.error(@shop_business_hour_form.errors.full_messages)
        render :new
      end
    end

    def update
      @shop_business_hour_form = ShopBusinessHourForm.new(shop_business_hour_form_params, @shop)
      @form_url = admin_shop_path(@shop)
      @form_method = :patch
      if @shop_business_hour_form.update(@shop)
        redirect_to [:admin, @shop], notice: 'ショップの更新が完了しました'
      else
        render :edit
      end
    end

    def destroy
      @shop.destroy
      redirect_to admin_shops_url, notice: 'ショップの削除が完了しました'
    end

    private

    def set_shop
      @shop = Shop.find(params[:id])
    end

    def shop_business_hour_form_params
      params.require(:shop_business_hour_form).permit(
        :shop_name, :address, :phone_number, :duel_space_available, :opening_hours, :official_hp, :twitter, :instagram, :tag_list,
        business_hours_attributes: [:day_of_week, :opening_time, :closing_time, :_destroy]
      ).merge(user_id: current_user.id) # ユーザーIDをマージ
    end

    def set_is_admin
      @is_admin = current_user&.admin?
    end
  end
end
# app/forms/shop_business_hour_form.rb
class ShopBusinessHourForm
  include ActiveModel::Model
  include ActiveModel::Attributes

  ATTRIBUTES = [:shop_name, :address, :phone_number, :duel_space_available, :opening_hours, :official_hp, :twitter, :instagram, :tag_list, :business_hours_attributes, :user_id]

  attr_accessor(*ATTRIBUTES)

  validate :validate_business_hours

  def initialize(params = nil, shop = nil)
    if shop
      @shop = shop
      self.shop_name = shop.name
      self.address = shop.address
      self.phone_number = shop.phone_number
      self.duel_space_available = shop.duel_space_available
      self.opening_hours = shop.opening_hours
      self.official_hp = shop.official_hp
      self.twitter = shop.twitter
      self.instagram = shop.instagram
      self.tag_list = shop.tag_list.join(",") if shop.tag_list.present?
      self.business_hours_attributes = shop.business_hours.map { |bh| bh.attributes.symbolize_keys.slice(:day_of_week, :opening_time, :closing_time) }
    else
      @shop = Shop.new
      self.business_hours_attributes = (0..6).map { |day| { day_of_week: day, opening_time: '09:00', closing_time: '18:00' } }
    end

    if params
      # 不要な属性を除外
      filtered_params = params.slice(*ATTRIBUTES)
      super(filtered_params)
    else
      super()
    end
  end

  def save
    return false unless valid?

    shop = Shop.new(
      name: shop_name,
      address: address,
      phone_number: phone_number,
      duel_space_available: duel_space_available,
      opening_hours: opening_hours,
      official_hp: official_hp,
      twitter: twitter,
      instagram: instagram,
      tag_list: tag_list,
      user_id: user_id # ユーザーIDを設定
    )
    if shop.save
      business_hours_attributes.each do |bh_attr|
        shop.business_hours.create(bh_attr)
      end
      true
    else
      errors.merge!(shop.errors)
      false
    end
  end

  def update(shop)
    return false unless valid?

    shop.assign_attributes(
      name: shop_name,
      address: address,
      phone_number: phone_number,
      duel_space_available: duel_space_available,
      opening_hours: opening_hours,
      official_hp: official_hp,
      twitter: twitter,
      instagram: instagram,
      tag_list: tag_list
    )
    if shop.save
      shop.business_hours.destroy_all
      business_hours_attributes.each do |bh_attr|
        shop.business_hours.create(bh_attr)
      end
      true
    else
      errors.merge!(shop.errors)
      false
    end
  end

  def business_hours
    business_hours_attributes
  end

  private

  def validate_business_hours
    business_hours_attributes.each do |bh|
      errors.add(:base, "Business hours Opening time can't be blank") if bh[:opening_time].blank?
      errors.add(:base, "Business hours Closing time can't be blank") if bh[:closing_time].blank?
    end
  end
end
<!-- app/views/admin/shops/_form.html.erb -->
<%= form_with(model: @shop_business_hour_form, url: @form_url, local: true, method: @form_method) do |form| %>
  <% if @shop_business_hour_form.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@shop_business_hour_form.errors.count, "error") %> prohibited this shop from being saved:</h2>
      <ul>
        <% @shop_business_hour_form.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :shop_name %>
    <%= form.text_field :shop_name, value: @shop_business_hour_form.shop_name %>
  </div>

  <div class="field">
    <%= form.label :address %>
    <%= form.text_field :address, value: @shop_business_hour_form.address %>
  </div>

  <div class="field">
    <%= form.label :phone_number %>
    <%= form.number_field :phone_number, value: @shop_business_hour_form.phone_number %>
  </div>

  <div class="field">
    <%= form.label :duel_space_available %>
    <%= form.number_field :duel_space_available, value: @shop_business_hour_form.duel_space_available %>
  </div>

  <div class="field">
    <%= form.label :opening_hours %>
    <%= form.text_field :opening_hours, value: @shop_business_hour_form.opening_hours %>
  </div>

  <div class="field">
    <%= form.label :official_hp %>
    <%= form.text_field :official_hp, value: @shop_business_hour_form.official_hp %>
  </div>

  <div class="field">
    <%= form.label :twitter %>
    <%= form.text_field :twitter, value: @shop_business_hour_form.twitter %>
  </div>

  <div class="field">
    <%= form.label :instagram %>
    <%= form.text_field :instagram, value: @shop_business_hour_form.instagram %>
  </div>

  <div class="field">
    <%= form.label :tag_list, "タグ" %>
    <%= form.text_field :tag_list, value: @shop_business_hour_form.tag_list || "", class: "form-control", data: { role: "tagsinput" } %>
  </div>

  <h3>Business Hours</h3>
  <% @shop_business_hour_form.business_hours.each_with_index do |bh, index| %>
    <div class="field">
      <%= form.label "business_hours_attributes_#{index}_day_of_week", "Day of the Week" %>
      <%= form.select "business_hours_attributes_#{index}_day_of_week", Date::DAYNAMES.each_with_index.map { |name, index| [name, index] }, selected: bh[:day_of_week] %>
    </div>
    <div class="field">
      <%= form.label "business_hours_attributes_#{index}_opening_time", "Opening Time" %>
      <%= form.time_select "business_hours_attributes_#{index}_opening_time", default: bh[:opening_time].to_time.change(year: 2000, month: 1, day: 1) || Time.zone.parse('09:00') %>
    </div>
    <div class="field">
      <%= form.label "business_hours_attributes_#{index}_closing_time", "Closing Time" %>
      <%= form.time_select "business_hours_attributes_#{index}_closing_time", default: bh[:closing_time].to_time.change(year: 2000, month: 1, day: 1) || Time.zone.parse('18:00') %>
    </div>
  <% end %>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>
portfolio-web-1  | Started PATCH "/admin/shops/53" for 192.168.65.1 at 2024-08-06 16:46:15 +0900
portfolio-web-1  | Cannot render console from 192.168.65.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1
portfolio-web-1  | Processing by Admin::ShopsController#update as TURBO_STREAM
portfolio-web-1  |   Parameters: {"authenticity_token"=>"[FILTERED]", "shop_business_hour_form"=>{"shop_name"=>"テスト6", "address"=>"新潟県新発田市大栄町2-5-12", "phone_number"=>"", "duel_space_available"=>"", "opening_hours"=>"", "official_hp"=>"", "twitter"=>"", "instagram"=>"", "tag_list"=>"", "business_hours_attributes_0_day_of_week"=>"0", "business_hours_attributes_0_opening_time(1i)"=>"2000", "business_hours_attributes_0_opening_time(2i)"=>"1", "business_hours_attributes_0_opening_time(3i)"=>"1", "business_hours_attributes_0_opening_time(4i)"=>"09", "business_hours_attributes_0_opening_time(5i)"=>"00", "business_hours_attributes_0_closing_time(1i)"=>"2000", "business_hours_attributes_0_closing_time(2i)"=>"1", "business_hours_attributes_0_closing_time(3i)"=>"1", "business_hours_attributes_0_closing_time(4i)"=>"18", "business_hours_attributes_0_closing_time(5i)"=>"00", "business_hours_attributes_1_day_of_week"=>"1", "business_hours_attributes_1_opening_time(1i)"=>"2000", "business_hours_attributes_1_opening_time(2i)"=>"1", "business_hours_attributes_1_opening_time(3i)"=>"1", "business_hours_attributes_1_opening_time(4i)"=>"09", "business_hours_attributes_1_opening_time(5i)"=>"00", "business_hours_attributes_1_closing_time(1i)"=>"2000", "business_hours_attributes_1_closing_time(2i)"=>"1", "business_hours_attributes_1_closing_time(3i)"=>"1", "business_hours_attributes_1_closing_time(4i)"=>"18", "business_hours_attributes_1_closing_time(5i)"=>"00", "business_hours_attributes_2_day_of_week"=>"2", "business_hours_attributes_2_opening_time(1i)"=>"2000", "business_hours_attributes_2_opening_time(2i)"=>"1", "business_hours_attributes_2_opening_time(3i)"=>"1", "business_hours_attributes_2_opening_time(4i)"=>"09", "business_hours_attributes_2_opening_time(5i)"=>"00", "business_hours_attributes_2_closing_time(1i)"=>"2000", "business_hours_attributes_2_closing_time(2i)"=>"1", "business_hours_attributes_2_closing_time(3i)"=>"1", "business_hours_attributes_2_closing_time(4i)"=>"18", "business_hours_attributes_2_closing_time(5i)"=>"00", "business_hours_attributes_3_day_of_week"=>"3", "business_hours_attributes_3_opening_time(1i)"=>"2000", "business_hours_attributes_3_opening_time(2i)"=>"1", "business_hours_attributes_3_opening_time(3i)"=>"1", "business_hours_attributes_3_opening_time(4i)"=>"09", "business_hours_attributes_3_opening_time(5i)"=>"00", "business_hours_attributes_3_closing_time(1i)"=>"2000", "business_hours_attributes_3_closing_time(2i)"=>"1", "business_hours_attributes_3_closing_time(3i)"=>"1", "business_hours_attributes_3_closing_time(4i)"=>"18", "business_hours_attributes_3_closing_time(5i)"=>"00", "business_hours_attributes_4_day_of_week"=>"4", "business_hours_attributes_4_opening_time(1i)"=>"2000", "business_hours_attributes_4_opening_time(2i)"=>"1", "business_hours_attributes_4_opening_time(3i)"=>"1", "business_hours_attributes_4_opening_time(4i)"=>"09", "business_hours_attributes_4_opening_time(5i)"=>"00", "business_hours_attributes_4_closing_time(1i)"=>"2000", "business_hours_attributes_4_closing_time(2i)"=>"1", "business_hours_attributes_4_closing_time(3i)"=>"1", "business_hours_attributes_4_closing_time(4i)"=>"18", "business_hours_attributes_4_closing_time(5i)"=>"00", "business_hours_attributes_5_day_of_week"=>"5", "business_hours_attributes_5_opening_time(1i)"=>"2000", "business_hours_attributes_5_opening_time(2i)"=>"1", "business_hours_attributes_5_opening_time(3i)"=>"1", "business_hours_attributes_5_opening_time(4i)"=>"09", "business_hours_attributes_5_opening_time(5i)"=>"00", "business_hours_attributes_5_closing_time(1i)"=>"2000", "business_hours_attributes_5_closing_time(2i)"=>"1", "business_hours_attributes_5_closing_time(3i)"=>"1", "business_hours_attributes_5_closing_time(4i)"=>"18", "business_hours_attributes_5_closing_time(5i)"=>"00", "business_hours_attributes_6_day_of_week"=>"6", "business_hours_attributes_6_opening_time(1i)"=>"2000", "business_hours_attributes_6_opening_time(2i)"=>"1", "business_hours_attributes_6_opening_time(3i)"=>"1", "business_hours_attributes_6_opening_time(4i)"=>"09", "business_hours_attributes_6_opening_time(5i)"=>"00", "business_hours_attributes_6_closing_time(1i)"=>"2000", "business_hours_attributes_6_closing_time(2i)"=>"1", "business_hours_attributes_6_closing_time(3i)"=>"1", "business_hours_attributes_6_closing_time(4i)"=>"18", "business_hours_attributes_6_closing_time(5i)"=>"00"}, "commit"=>"Create Shop business hour form", "id"=>"53"}
portfolio-web-1  |   User Load (3.8ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
portfolio-web-1  |   ↳ app/controllers/application_controller.rb:23:in `authenticate_admin!'
portfolio-web-1  |   Shop Load (1.4ms)  SELECT "shops".* FROM "shops" WHERE "shops"."id" = $1 LIMIT $2  [["id", 53], ["LIMIT", 1]]
portfolio-web-1  |   ↳ app/controllers/admin/shops_controller.rb:71:in `set_shop'
portfolio-web-1  | Unpermitted parameters: :business_hours_attributes_0_day_of_week, :business_hours_attributes_0_opening_time(1i), :business_hours_attributes_0_opening_time(2i), :business_hours_attributes_0_opening_time(3i), :business_hours_attributes_0_opening_time(4i), :business_hours_attributes_0_opening_time(5i), :business_hours_attributes_0_closing_time(1i), :business_hours_attributes_0_closing_time(2i), :business_hours_attributes_0_closing_time(3i), :business_hours_attributes_0_closing_time(4i), :business_hours_attributes_0_closing_time(5i), :business_hours_attributes_1_day_of_week, :business_hours_attributes_1_opening_time(1i), :business_hours_attributes_1_opening_time(2i), :business_hours_attributes_1_opening_time(3i), :business_hours_attributes_1_opening_time(4i), :business_hours_attributes_1_opening_time(5i), :business_hours_attributes_1_closing_time(1i), :business_hours_attributes_1_closing_time(2i), :business_hours_attributes_1_closing_time(3i), :business_hours_attributes_1_closing_time(4i), :business_hours_attributes_1_closing_time(5i), :business_hours_attributes_2_day_of_week, :business_hours_attributes_2_opening_time(1i), :business_hours_attributes_2_opening_time(2i), :business_hours_attributes_2_opening_time(3i), :business_hours_attributes_2_opening_time(4i), :business_hours_attributes_2_opening_time(5i), :business_hours_attributes_2_closing_time(1i), :business_hours_attributes_2_closing_time(2i), :business_hours_attributes_2_closing_time(3i), :business_hours_attributes_2_closing_time(4i), :business_hours_attributes_2_closing_time(5i), :business_hours_attributes_3_day_of_week, :business_hours_attributes_3_opening_time(1i), :business_hours_attributes_3_opening_time(2i), :business_hours_attributes_3_opening_time(3i), :business_hours_attributes_3_opening_time(4i), :business_hours_attributes_3_opening_time(5i), :business_hours_attributes_3_closing_time(1i), :business_hours_attributes_3_closing_time(2i), :business_hours_attributes_3_closing_time(3i), :business_hours_attributes_3_closing_time(4i), :business_hours_attributes_3_closing_time(5i), :business_hours_attributes_4_day_of_week, :business_hours_attributes_4_opening_time(1i), :business_hours_attributes_4_opening_time(2i), :business_hours_attributes_4_opening_time(3i), :business_hours_attributes_4_opening_time(4i), :business_hours_attributes_4_opening_time(5i), :business_hours_attributes_4_closing_time(1i), :business_hours_attributes_4_closing_time(2i), :business_hours_attributes_4_closing_time(3i), :business_hours_attributes_4_closing_time(4i), :business_hours_attributes_4_closing_time(5i), :business_hours_attributes_5_day_of_week, :business_hours_attributes_5_opening_time(1i), :business_hours_attributes_5_opening_time(2i), :business_hours_attributes_5_opening_time(3i), :business_hours_attributes_5_opening_time(4i), :business_hours_attributes_5_opening_time(5i), :business_hours_attributes_5_closing_time(1i), :business_hours_attributes_5_closing_time(2i), :business_hours_attributes_5_closing_time(3i), :business_hours_attributes_5_closing_time(4i), :business_hours_attributes_5_closing_time(5i), :business_hours_attributes_6_day_of_week, :business_hours_attributes_6_opening_time(1i), :business_hours_attributes_6_opening_time(2i), :business_hours_attributes_6_opening_time(3i), :business_hours_attributes_6_opening_time(4i), :business_hours_attributes_6_opening_time(5i), :business_hours_attributes_6_closing_time(1i), :business_hours_attributes_6_closing_time(2i), :business_hours_attributes_6_closing_time(3i), :business_hours_attributes_6_closing_time(4i), :business_hours_attributes_6_closing_time(5i). Context: { controller: Admin::ShopsController, action: update, request: #<ActionDispatch::Request:0x0000ffff81262a88>, params: {"_method"=>"patch", "authenticity_token"=>"[FILTERED]", "shop_business_hour_form"=>{"shop_name"=>"テスト6", "address"=>"新潟県新発田市大栄町2-5-12", "phone_number"=>"", "duel_space_available"=>"", "opening_hours"=>"", "official_hp"=>"", "twitter"=>"", "instagram"=>"", "tag_list"=>"", "business_hours_attributes_0_day_of_week"=>"0", "business_hours_attributes_0_opening_time(1i)"=>"2000", "business_hours_attributes_0_opening_time(2i)"=>"1", "business_hours_attributes_0_opening_time(3i)"=>"1", "business_hours_attributes_0_opening_time(4i)"=>"09", "business_hours_attributes_0_opening_time(5i)"=>"00", "business_hours_attributes_0_closing_time(1i)"=>"2000", "business_hours_attributes_0_closing_time(2i)"=>"1", "business_hours_attributes_0_closing_time(3i)"=>"1", "business_hours_attributes_0_closing_time(4i)"=>"18", "business_hours_attributes_0_closing_time(5i)"=>"00", "business_hours_attributes_1_day_of_week"=>"1", "business_hours_attributes_1_opening_time(1i)"=>"2000", "business_hours_attributes_1_opening_time(2i)"=>"1", "business_hours_attributes_1_opening_time(3i)"=>"1", "business_hours_attributes_1_opening_time(4i)"=>"09", "business_hours_attributes_1_opening_time(5i)"=>"00", "business_hours_attributes_1_closing_time(1i)"=>"2000", "business_hours_attributes_1_closing_time(2i)"=>"1", "business_hours_attributes_1_closing_time(3i)"=>"1", "business_hours_attributes_1_closing_time(4i)"=>"18", "business_hours_attributes_1_closing_time(5i)"=>"00", "business_hours_attributes_2_day_of_week"=>"2", "business_hours_attributes_2_opening_time(1i)"=>"2000", "business_hours_attributes_2_opening_time(2i)"=>"1", "business_hours_attributes_2_opening_time(3i)"=>"1", "business_hours_attributes_2_opening_time(4i)"=>"09", "business_hours_attributes_2_opening_time(5i)"=>"00", "business_hours_attributes_2_closing_time(1i)"=>"2000", "business_hours_attributes_2_closing_time(2i)"=>"1", "business_hours_attributes_2_closing_time(3i)"=>"1", "business_hours_attributes_2_closing_time(4i)"=>"18", "business_hours_attributes_2_closing_time(5i)"=>"00", "business_hours_attributes_3_day_of_week"=>"3", "business_hours_attributes_3_opening_time(1i)"=>"2000", "business_hours_attributes_3_opening_time(2i)"=>"1", "business_hours_attributes_3_opening_time(3i)"=>"1", "business_hours_attributes_3_opening_time(4i)"=>"09", "business_hours_attributes_3_opening_time(5i)"=>"00", "business_hours_attributes_3_closing_time(1i)"=>"2000", "business_hours_attributes_3_closing_time(2i)"=>"1", "business_hours_attributes_3_closing_time(3i)"=>"1", "business_hours_attributes_3_closing_time(4i)"=>"18", "business_hours_attributes_3_closing_time(5i)"=>"00", "business_hours_attributes_4_day_of_week"=>"4", "business_hours_attributes_4_opening_time(1i)"=>"2000", "business_hours_attributes_4_opening_time(2i)"=>"1", "business_hours_attributes_4_opening_time(3i)"=>"1", "business_hours_attributes_4_opening_time(4i)"=>"09", "business_hours_attributes_4_opening_time(5i)"=>"00", "business_hours_attributes_4_closing_time(1i)"=>"2000", "business_hours_attributes_4_closing_time(2i)"=>"1", "business_hours_attributes_4_closing_time(3i)"=>"1", "business_hours_attributes_4_closing_time(4i)"=>"18", "business_hours_attributes_4_closing_time(5i)"=>"00", "business_hours_attributes_5_day_of_week"=>"5", "business_hours_attributes_5_opening_time(1i)"=>"2000", "business_hours_attributes_5_opening_time(2i)"=>"1", "business_hours_attributes_5_opening_time(3i)"=>"1", "business_hours_attributes_5_opening_time(4i)"=>"09", "business_hours_attributes_5_opening_time(5i)"=>"00", "business_hours_attributes_5_closing_time(1i)"=>"2000", "business_hours_attributes_5_closing_time(2i)"=>"1", "business_hours_attributes_5_closing_time(3i)"=>"1", "business_hours_attributes_5_closing_time(4i)"=>"18", "business_hours_attributes_5_closing_time(5i)"=>"00", "business_hours_attributes_6_day_of_week"=>"6", "business_hours_attributes_6_opening_time(1i)"=>"2000", "business_hours_attributes_6_opening_time(2i)"=>"1", "business_hours_attributes_6_opening_time(3i)"=>"1", "business_hours_attributes_6_opening_time(4i)"=>"09", "business_hours_attributes_6_opening_time(5i)"=>"00", "business_hours_attributes_6_closing_time(1i)"=>"2000", "business_hours_attributes_6_closing_time(2i)"=>"1", "business_hours_attributes_6_closing_time(3i)"=>"1", "business_hours_attributes_6_closing_time(4i)"=>"18", "business_hours_attributes_6_closing_time(5i)"=>"00"}, "commit"=>"Create Shop business hour form", "controller"=>"admin/shops", "action"=>"update", "id"=>"53"} }
portfolio-web-1  |   ActsAsTaggableOn::Tagging Load (3.4ms)  SELECT "taggings".* FROM "taggings" WHERE "taggings"."taggable_id" = $1 AND "taggings"."taggable_type" = $2  [["taggable_id", 53], ["taggable_type", "Shop"]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:22:in `initialize'
portfolio-web-1  |   ActsAsTaggableOn::Tag Load (5.8ms)  SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = $1 AND "taggings"."taggable_type" = $2 AND (taggings.context = 'tags' AND taggings.tagger_id IS NULL)  [["taggable_id", 53], ["taggable_type", "Shop"]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:22:in `initialize'
portfolio-web-1  |   BusinessHour Load (1.2ms)  SELECT "business_hours".* FROM "business_hours" WHERE "business_hours"."shop_id" = $1  [["shop_id", 53]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:23:in `map'
portfolio-web-1  |   TRANSACTION (0.4ms)  BEGIN
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:78:in `update'
portfolio-web-1  |   Shop Exists? (1.5ms)  SELECT 1 AS one FROM "shops" WHERE "shops"."name" = $1 AND "shops"."id" != $2 LIMIT $3  [["name", "テスト6"], ["id", 53], ["LIMIT", 1]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:78:in `update'
portfolio-web-1  |   User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:78:in `update'
portfolio-web-1  |   CACHE ActsAsTaggableOn::Tag Load (0.0ms)  SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = $1 AND "taggings"."taggable_type" = $2 AND (taggings.context = 'tags' AND taggings.tagger_id IS NULL)  [["taggable_id", 53], ["taggable_type", "Shop"]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:78:in `update'
portfolio-web-1  |   TRANSACTION (2.8ms)  COMMIT
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:78:in `update'
portfolio-web-1  |   TRANSACTION (0.5ms)  BEGIN
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:79:in `update'
portfolio-web-1  |   BusinessHour Destroy (12.7ms)  DELETE FROM "business_hours" WHERE "business_hours"."id" = $1  [["id", 288]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:79:in `update'
portfolio-web-1  |   BusinessHour Destroy (2.0ms)  DELETE FROM "business_hours" WHERE "business_hours"."id" = $1  [["id", 289]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:79:in `update'
portfolio-web-1  |   BusinessHour Destroy (1.5ms)  DELETE FROM "business_hours" WHERE "business_hours"."id" = $1  [["id", 290]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:79:in `update'
portfolio-web-1  |   BusinessHour Destroy (1.3ms)  DELETE FROM "business_hours" WHERE "business_hours"."id" = $1  [["id", 291]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:79:in `update'
portfolio-web-1  |   BusinessHour Destroy (1.6ms)  DELETE FROM "business_hours" WHERE "business_hours"."id" = $1  [["id", 292]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:79:in `update'
portfolio-web-1  |   BusinessHour Destroy (1.1ms)  DELETE FROM "business_hours" WHERE "business_hours"."id" = $1  [["id", 293]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:79:in `update'
portfolio-web-1  |   BusinessHour Destroy (1.2ms)  DELETE FROM "business_hours" WHERE "business_hours"."id" = $1  [["id", 294]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:79:in `update'
portfolio-web-1  |   TRANSACTION (3.6ms)  COMMIT
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:79:in `update'
portfolio-web-1  |   TRANSACTION (0.3ms)  BEGIN
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   BusinessHour Create (19.1ms)  INSERT INTO "business_hours" ("shop_id", "day_of_week", "opening_time", "closing_time", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["shop_id", 53], ["day_of_week", 0], ["opening_time", "00:00:00"], ["closing_time", "09:00:00"], ["created_at", "2024-08-06 07:46:16.172688"], ["updated_at", "2024-08-06 07:46:16.172688"]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   TRANSACTION (0.8ms)  COMMIT
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   TRANSACTION (0.2ms)  BEGIN
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   BusinessHour Create (1.8ms)  INSERT INTO "business_hours" ("shop_id", "day_of_week", "opening_time", "closing_time", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["shop_id", 53], ["day_of_week", 1], ["opening_time", "00:00:00"], ["closing_time", "09:00:00"], ["created_at", "2024-08-06 07:46:16.196887"], ["updated_at", "2024-08-06 07:46:16.196887"]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   TRANSACTION (0.5ms)  COMMIT
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   TRANSACTION (0.2ms)  BEGIN
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   BusinessHour Create (1.4ms)  INSERT INTO "business_hours" ("shop_id", "day_of_week", "opening_time", "closing_time", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["shop_id", 53], ["day_of_week", 2], ["opening_time", "00:00:00"], ["closing_time", "09:00:00"], ["created_at", "2024-08-06 07:46:16.202575"], ["updated_at", "2024-08-06 07:46:16.202575"]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   TRANSACTION (0.5ms)  COMMIT
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   TRANSACTION (0.1ms)  BEGIN
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   BusinessHour Create (1.1ms)  INSERT INTO "business_hours" ("shop_id", "day_of_week", "opening_time", "closing_time", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["shop_id", 53], ["day_of_week", 3], ["opening_time", "00:00:00"], ["closing_time", "09:00:00"], ["created_at", "2024-08-06 07:46:16.209003"], ["updated_at", "2024-08-06 07:46:16.209003"]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   TRANSACTION (0.4ms)  COMMIT
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   TRANSACTION (0.2ms)  BEGIN
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   BusinessHour Create (1.1ms)  INSERT INTO "business_hours" ("shop_id", "day_of_week", "opening_time", "closing_time", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["shop_id", 53], ["day_of_week", 4], ["opening_time", "00:00:00"], ["closing_time", "09:00:00"], ["created_at", "2024-08-06 07:46:16.212953"], ["updated_at", "2024-08-06 07:46:16.212953"]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   TRANSACTION (0.4ms)  COMMIT
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   TRANSACTION (0.2ms)  BEGIN
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   BusinessHour Create (1.3ms)  INSERT INTO "business_hours" ("shop_id", "day_of_week", "opening_time", "closing_time", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["shop_id", 53], ["day_of_week", 5], ["opening_time", "00:00:00"], ["closing_time", "09:00:00"], ["created_at", "2024-08-06 07:46:16.217274"], ["updated_at", "2024-08-06 07:46:16.217274"]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   TRANSACTION (0.5ms)  COMMIT
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   TRANSACTION (0.2ms)  BEGIN
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   BusinessHour Create (1.1ms)  INSERT INTO "business_hours" ("shop_id", "day_of_week", "opening_time", "closing_time", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["shop_id", 53], ["day_of_week", 6], ["opening_time", "00:00:00"], ["closing_time", "09:00:00"], ["created_at", "2024-08-06 07:46:16.222332"], ["updated_at", "2024-08-06 07:46:16.222332"]]
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  |   TRANSACTION (0.4ms)  COMMIT
portfolio-web-1  |   ↳ app/forms/shop_business_hour_form.rb:81:in `block in update'
portfolio-web-1  | Redirected to http://localhost:3000/admin/shops/53
portfolio-web-1  | Completed 302 Found in 543ms (ActiveRecord: 133.7ms | Allocations: 38487)

Image from Gyazo

kenchasonakai commented 1 month ago

ControllerからFormObjectを呼び出している部分がカットされてしまっているのですべて記載してもらえると助かります

また、binding.pry等を使ってどこまでご自身が意図しているデータがわたっているのか確認してみるとよいかなと思います

taiti101112 commented 1 month ago

ご返信ありがとうございます。 スクリーンショットで全体が表示されているものを上げ直しましたのでご確認のほどよろしくお願いいたします。

binding.pryでデータがどこで自分の意図したものではないものになっているのかを確認してみようと思いますのでまた分からないことが出てきたらよろしくお願いいたします。

taiti101112 commented 1 month ago

お疲れ様です。 先日教えていただいたようにデバックを行いどのようなデータが渡っているのかの確認を行いました。 その結果、自分の意図したデータが送られていましたがそれでも尚、「Unpermitted parameters」が出てしまい、データを正しく保存することができません。 原因としてはストロングパラメーターで各曜日それぞれの営業時間を指定していないからではないかと考え、以下のようにストロングパラメーターにそれぞれの曜日の営業時間を指定したものを追加したしましたが解決には至りませんでした。

また、チャットGPTにもエラー解決のための質問をした結果、上記に記載したようなことが原因ということで何度も修正を行いましたが解決することができませんでした。

これ以上は原因が考えつきませんので他に何か原因があれば教えていただけますでしょうか? 以下に該当書のコードとログとデバック結果を記載しましたのでご確認のほどよろしくお願い致します。


# app/controllers/admin/shops_controller.rb
module Admin
  class ShopsController < ApplicationController
    before_action :authenticate_admin!
    before_action :set_shop, only: [:show, :edit, :update, :destroy, :edit_hours, :update_hours]
    before_action :set_is_admin

    def index
      @q = Shop.ransack(params[:q])
      if params[:q].present?
        @shops = @q.result(distinct: true)
      else
        @shops = Shop.all
      end

      if params[:tag_name]
        @shops = @shops.tagged_with(params[:tag_name])
      end
    end

    def show
      @tags = @shop.tag_counts_on(:tags)
    end

    def new
      @shop_business_hour_form = ShopBusinessHourForm.new
      @form_url = admin_shops_path
      @form_method = :post
    end

    def edit
      shop_params = @shop.attributes.symbolize_keys.slice(*ShopBusinessHourForm::ATTRIBUTES)
      shop_params[:tag_list] = @shop.tag_list.join(",") if @shop.tag_list.present?
      @shop_business_hour_form = ShopBusinessHourForm.new(shop_params, @shop)
      @form_url = admin_shop_path(@shop)
      @form_method = :patch
    end

    def create
      @shop_business_hour_form = ShopBusinessHourForm.new(shop_business_hour_form_params)
      @shop_business_hour_form.user_id = current_user.id # 現在のユーザーのIDを設定
      @form_url = admin_shops_path
      @form_method = :post

      binding.pry

      if @shop_business_hour_form.save
        redirect_to [:admin, Shop.find_by(name: @shop_business_hour_form.shop_name)], notice: 'Shop and business hours were successfully created.'
      else
        Rails.logger.error(@shop_business_hour_form.errors.full_messages)
        render :new
      end
    end

    def update
      @shop_business_hour_form = ShopBusinessHourForm.new(shop_business_hour_form_params, @shop)
      @form_url = admin_shop_path(@shop)
      @form_method = :patch
      if @shop_business_hour_form.update(@shop)
        redirect_to [:admin, @shop], notice: 'ショップの更新が完了しました'
      else
        render :edit
      end
    end

    def destroy
      @shop.destroy
      redirect_to admin_shops_url, notice: 'ショップの削除が完了しました'
    end

    private

    def set_shop
      @shop = Shop.find(params[:id])
    end

    def shop_business_hour_form_params
      params.require(:shop_business_hour_form).permit(
        :shop_name, :address, :phone_number, :duel_space_available, :opening_hours, :official_hp, :twitter, :instagram, :tag_list,
        business_hours_attributes: [
          :day_of_week,
          :_destroy,
          'opening_time(1i)', 'opening_time(2i)', 'opening_time(3i)', 'opening_time(4i)', 'opening_time(5i)',
          'closing_time(1i)', 'closing_time(2i)', 'closing_time(3i)', 'closing_time(4i)', 'closing_time(5i)'
        ]
      ).merge(user_id: current_user.id)
    end

    def set_is_admin
      @is_admin = current_user&.admin?
    end
  end
end
# app/forms/shop_business_hour_form.rb
class ShopBusinessHourForm
  include ActiveModel::Model

  ATTRIBUTES = [:shop_name, :address, :phone_number, :duel_space_available, :opening_hours, :official_hp, :twitter, :instagram, :tag_list, :business_hours_attributes, :user_id]

  attr_accessor(*ATTRIBUTES)

  validate :validate_business_hours

  def initialize(params = nil, shop = nil)
    if shop
      @shop = shop
      self.shop_name = shop.name
      self.address = shop.address
      self.phone_number = shop.phone_number
      self.duel_space_available = shop.duel_space_available
      self.opening_hours = shop.opening_hours
      self.official_hp = shop.official_hp
      self.twitter = shop.twitter
      self.instagram = shop.instagram
      self.tag_list = shop.tag_list.join(",") if shop.tag_list.present?
      self.business_hours_attributes = shop.business_hours.map { |bh| bh.attributes.symbolize_keys.slice(:day_of_week, :opening_time, :closing_time) }
    else
      @shop = Shop.new
      self.business_hours_attributes = (0..6).map { |day| { day_of_week: day, opening_time: '09:00', closing_time: '18:00' } }
    end

    if params
      filtered_params = params.slice(*ATTRIBUTES)
      Rails.logger.info(filtered_params.inspect) # パラメータの内容を確認
      super(filtered_params)
    else
      super()
    end
  end

  def save
    return false unless valid?

    # business_hours_attributesの内容を確認
    Rails.logger.info(business_hours_attributes.inspect)

    shop = Shop.new(
      name: shop_name,
      address: address,
      phone_number: phone_number,
      duel_space_available: duel_space_available,
      opening_hours: opening_hours,
      official_hp: official_hp,
      twitter: twitter,
      instagram: instagram,
      tag_list: tag_list,
      user_id: user_id # ユーザーIDを設定
    )

    if shop.save
      business_hours_attributes.each do |bh_attr|
        Rails.logger.info(bh_attr.inspect) # データの内容をログに出力
        shop.business_hours.create(bh_attr)
      end
      true
    else
      errors.merge!(shop.errors)
      false
    end
  end

  def update(shop)
    return false unless valid?

    shop.assign_attributes(
      name: shop_name,
      address: address,
      phone_number: phone_number,
      duel_space_available: duel_space_available,
      opening_hours: opening_hours,
      official_hp: official_hp,
      twitter: twitter,
      instagram: instagram,
      tag_list: tag_list
    )
    if shop.save
      shop.business_hours.destroy_all
      business_hours_attributes.each do |bh_attr|
        shop.business_hours.create(bh_attr)
      end
      true
    else
      errors.merge!(shop.errors)
      false
    end
  end

  def business_hours
    business_hours_attributes
  end

  private

  def validate_business_hours
    business_hours_attributes.each do |bh|
      errors.add(:base, "Business hours Opening time can't be blank") if bh[:opening_time].blank?
      errors.add(:base, "Business hours Closing time can't be blank") if bh[:closing_time].blank?
    end
  end
end
<!-- app/views/admin/shops/_form.html.erb -->
<%= form_with(model: @shop_business_hour_form, url: @form_url, local: true, method: @form_method) do |form| %>
  <% if @shop_business_hour_form.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@shop_business_hour_form.errors.count, "error") %> prohibited this shop from being saved:</h2>
      <ul>
        <% @shop_business_hour_form.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :shop_name %>
    <%= form.text_field :shop_name, value: @shop_business_hour_form.shop_name %>
  </div>

  <div class="field">
    <%= form.label :address %>
    <%= form.text_field :address, value: @shop_business_hour_form.address %>
  </div>

  <div class="field">
    <%= form.label :phone_number %>
    <%= form.number_field :phone_number, value: @shop_business_hour_form.phone_number %>
  </div>

  <div class="field">
    <%= form.label :duel_space_available %>
    <%= form.number_field :duel_space_available, value: @shop_business_hour_form.duel_space_available %>
  </div>

  <div class="field">
    <%= form.label :opening_hours %>
    <%= form.text_field :opening_hours, value: @shop_business_hour_form.opening_hours %>
  </div>

  <div class="field">
    <%= form.label :official_hp %>
    <%= form.text_field :official_hp, value: @shop_business_hour_form.official_hp %>
  </div>

  <div class="field">
    <%= form.label :twitter %>
    <%= form.text_field :twitter, value: @shop_business_hour_form.twitter %>
  </div>

  <div class="field">
    <%= form.label :instagram %>
    <%= form.text_field :instagram, value: @shop_business_hour_form.instagram %>
  </div>

  <div class="field">
    <%= form.label :tag_list, "タグ" %>
    <%= form.text_field :tag_list, value: @shop_business_hour_form.tag_list || "", class: "form-control", data: { role: "tagsinput" } %>
  </div>

  <h3>Business Hours</h3>
  <% @shop_business_hour_form.business_hours.each_with_index do |bh, index| %>
    <div class="field">
      <%= form.label "business_hours_attributes_#{index}_day_of_week", "Day of the Week" %>
      <%= form.select "business_hours_attributes_#{index}_day_of_week", Date::DAYNAMES.each_with_index.map { |name, index| [name, index] }, selected: bh[:day_of_week] %>
    </div>
    <div class="field">
      <%= form.label "business_hours_attributes_#{index}_opening_time", "Opening Time" %>
      <%= form.time_select "business_hours_attributes_#{index}_opening_time", default: bh[:opening_time].to_time.change(year: 2000, month: 1, day: 1) || Time.zone.parse('09:00') %>
    </div>
    <div class="field">
      <%= form.label "business_hours_attributes_#{index}_closing_time", "Closing Time" %>
      <%= form.time_select "business_hours_attributes_#{index}_closing_time", default: bh[:closing_time].to_time.change(year: 2000, month: 1, day: 1) || Time.zone.parse('18:00') %>
    </div>
  <% end %>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

From: /app/app/controllers/admin/shops_controller.rb:45 Admin::ShopsController#create:

39: def create
40:   @shop_business_hour_form = ShopBusinessHourForm.new(shop_business_hour_form_params)
41:   @shop_business_hour_form.user_id = current_user.id # 現在のユーザーのIDを設定
42:   @form_url = admin_shops_path
43:   @form_method = :post
44:   
45:   binding.pry
46:   
47:   if @shop_business_hour_form.save
48:     redirect_to [:admin, Shop.find_by(name: @shop_business_hour_form.shop_name)], notice: 'Shop and business hours were successfully created.'
49:   else
50:     Rails.logger.error(@shop_business_hour_form.errors.full_messages)
51:     render :new
52:   end
53: end

[1] pry(#)> params => #<ActionController::Parameters {"authenticity_token"=>"pVXylPXM9ayVb2ZqqytMHAADNFcAFeSixCRSQEiKF40zzijL6y4fs_XrbVggek7na3yH8tcxGPx--J5uxngsnw", "shop_business_hour_form"=>#<ActionController::Parameters {"shop_name"=>"テスト643", "address"=>"新潟県新発田市大栄町2-5-12", "phone_number"=>"", "duel_space_available"=>"", "opening_hours"=>"", "official_hp"=>"", "twitter"=>"", "instagram"=>"", "tag_list"=>"", "business_hours_attributes_0_day_of_week"=>"0", "business_hours_attributes_0_opening_time(1i)"=>"2000", "business_hours_attributes_0_opening_time(2i)"=>"1", "business_hours_attributes_0_opening_time(3i)"=>"1", "business_hours_attributes_0_opening_time(4i)"=>"11", "business_hours_attributes_0_opening_time(5i)"=>"00", "business_hours_attributes_0_closing_time(1i)"=>"2000", "business_hours_attributes_0_closing_time(2i)"=>"1", "business_hours_attributes_0_closing_time(3i)"=>"1", "business_hours_attributes_0_closing_time(4i)"=>"13", "business_hours_attributes_0_closing_time(5i)"=>"00", "business_hours_attributes_1_day_of_week"=>"1", "business_hours_attributes_1_opening_time(1i)"=>"2000", "business_hours_attributes_1_opening_time(2i)"=>"1", "business_hours_attributes_1_opening_time(3i)"=>"1", "business_hours_attributes_1_opening_time(4i)"=>"09", "business_hours_attributes_1_opening_time(5i)"=>"00", "business_hours_attributes_1_closing_time(1i)"=>"2000", "business_hours_attributes_1_closing_time(2i)"=>"1", "business_hours_attributes_1_closing_time(3i)"=>"1", "business_hours_attributes_1_closing_time(4i)"=>"18", "business_hours_attributes_1_closing_time(5i)"=>"00", "business_hours_attributes_2_day_of_week"=>"2", "business_hours_attributes_2_opening_time(1i)"=>"2000", "business_hours_attributes_2_opening_time(2i)"=>"1", "business_hours_attributes_2_opening_time(3i)"=>"1", "business_hours_attributes_2_opening_time(4i)"=>"09", "business_hours_attributes_2_opening_time(5i)"=>"00", "business_hours_attributes_2_closing_time(1i)"=>"2000", "business_hours_attributes_2_closing_time(2i)"=>"1", "business_hours_attributes_2_closing_time(3i)"=>"1", "business_hours_attributes_2_closing_time(4i)"=>"18", "business_hours_attributes_2_closing_time(5i)"=>"00", "business_hours_attributes_3_day_of_week"=>"3", "business_hours_attributes_3_opening_time(1i)"=>"2000", "business_hours_attributes_3_opening_time(2i)"=>"1", "business_hours_attributes_3_opening_time(3i)"=>"1", "business_hours_attributes_3_opening_time(4i)"=>"09", "business_hours_attributes_3_opening_time(5i)"=>"00", "business_hours_attributes_3_closing_time(1i)"=>"2000", "business_hours_attributes_3_closing_time(2i)"=>"1", "business_hours_attributes_3_closing_time(3i)"=>"1", "business_hours_attributes_3_closing_time(4i)"=>"18", "business_hours_attributes_3_closing_time(5i)"=>"00", "business_hours_attributes_4_day_of_week"=>"4", "business_hours_attributes_4_opening_time(1i)"=>"2000", "business_hours_attributes_4_opening_time(2i)"=>"1", "business_hours_attributes_4_opening_time(3i)"=>"1", "business_hours_attributes_4_opening_time(4i)"=>"09", "business_hours_attributes_4_opening_time(5i)"=>"00", "business_hours_attributes_4_closing_time(1i)"=>"2000", "business_hours_attributes_4_closing_time(2i)"=>"1", "business_hours_attributes_4_closing_time(3i)"=>"1", "business_hours_attributes_4_closing_time(4i)"=>"18", "business_hours_attributes_4_closing_time(5i)"=>"00", "business_hours_attributes_5_day_of_week"=>"5", "business_hours_attributes_5_opening_time(1i)"=>"2000", "business_hours_attributes_5_opening_time(2i)"=>"1", "business_hours_attributes_5_opening_time(3i)"=>"1", "business_hours_attributes_5_opening_time(4i)"=>"09", "business_hours_attributes_5_opening_time(5i)"=>"00", "business_hours_attributes_5_closing_time(1i)"=>"2000", "business_hours_attributes_5_closing_time(2i)"=>"1", "business_hours_attributes_5_closing_time(3i)"=>"1", "business_hours_attributes_5_closing_time(4i)"=>"18", "business_hours_attributes_5_closing_time(5i)"=>"00", "business_hours_attributes_6_day_of_week"=>"6", "business_hours_attributes_6_opening_time(1i)"=>"2000", "business_hours_attributes_6_opening_time(2i)"=>"1", "business_hours_attributes_6_opening_time(3i)"=>"1", "business_hours_attributes_6_opening_time(4i)"=>"09", "business_hours_attributes_6_opening_time(5i)"=>"00", "business_hours_attributes_6_closing_time(1i)"=>"2000", "business_hours_attributes_6_closing_time(2i)"=>"1", "business_hours_attributes_6_closing_time(3i)"=>"1", "business_hours_attributes_6_closing_time(4i)"=>"18", "business_hours_attributes_6_closing_time(5i)"=>"00"} permitted: false>, "commit"=>"Create Shop business hour form", "controller"=>"admin/shops", "action"=>"create"} permitted: false>

portfolio-web-1 | Started POST "/admin/shops" for 192.168.65.1 at 2024-08-14 13:42:29 +0900 portfolio-web-1 | Cannot render console from 192.168.65.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 portfolio-web-1 | Processing by Admin::ShopsController#create as TURBO_STREAM portfolio-web-1 | Parameters: {"authenticity_token"=>"[FILTERED]", "shop_business_hour_form"=>{"shop_name"=>"テスト643", "address"=>"新潟県新発田市大栄町2-5-12", "phone_number"=>"", "duel_space_available"=>"", "opening_hours"=>"", "official_hp"=>"", "twitter"=>"", "instagram"=>"", "tag_list"=>"", "business_hours_attributes_0_day_of_week"=>"0", "business_hours_attributes_0_opening_time(1i)"=>"2000", "business_hours_attributes_0_opening_time(2i)"=>"1", "business_hours_attributes_0_opening_time(3i)"=>"1", "business_hours_attributes_0_opening_time(4i)"=>"11", "business_hours_attributes_0_opening_time(5i)"=>"00", "business_hours_attributes_0_closing_time(1i)"=>"2000", "business_hours_attributes_0_closing_time(2i)"=>"1", "business_hours_attributes_0_closing_time(3i)"=>"1", "business_hours_attributes_0_closing_time(4i)"=>"13", "business_hours_attributes_0_closing_time(5i)"=>"00", "business_hours_attributes_1_day_of_week"=>"1", "business_hours_attributes_1_opening_time(1i)"=>"2000", "business_hours_attributes_1_opening_time(2i)"=>"1", "business_hours_attributes_1_opening_time(3i)"=>"1", "business_hours_attributes_1_opening_time(4i)"=>"09", "business_hours_attributes_1_opening_time(5i)"=>"00", "business_hours_attributes_1_closing_time(1i)"=>"2000", "business_hours_attributes_1_closing_time(2i)"=>"1", "business_hours_attributes_1_closing_time(3i)"=>"1", "business_hours_attributes_1_closing_time(4i)"=>"18", "business_hours_attributes_1_closing_time(5i)"=>"00", "business_hours_attributes_2_day_of_week"=>"2", "business_hours_attributes_2_opening_time(1i)"=>"2000", "business_hours_attributes_2_opening_time(2i)"=>"1", "business_hours_attributes_2_opening_time(3i)"=>"1", "business_hours_attributes_2_opening_time(4i)"=>"09", "business_hours_attributes_2_opening_time(5i)"=>"00", "business_hours_attributes_2_closing_time(1i)"=>"2000", "business_hours_attributes_2_closing_time(2i)"=>"1", "business_hours_attributes_2_closing_time(3i)"=>"1", "business_hours_attributes_2_closing_time(4i)"=>"18", "business_hours_attributes_2_closing_time(5i)"=>"00", "business_hours_attributes_3_day_of_week"=>"3", "business_hours_attributes_3_opening_time(1i)"=>"2000", "business_hours_attributes_3_opening_time(2i)"=>"1", "business_hours_attributes_3_opening_time(3i)"=>"1", "business_hours_attributes_3_opening_time(4i)"=>"09", "business_hours_attributes_3_opening_time(5i)"=>"00", "business_hours_attributes_3_closing_time(1i)"=>"2000", "business_hours_attributes_3_closing_time(2i)"=>"1", "business_hours_attributes_3_closing_time(3i)"=>"1", "business_hours_attributes_3_closing_time(4i)"=>"18", "business_hours_attributes_3_closing_time(5i)"=>"00", "business_hours_attributes_4_day_of_week"=>"4", "business_hours_attributes_4_opening_time(1i)"=>"2000", "business_hours_attributes_4_opening_time(2i)"=>"1", "business_hours_attributes_4_opening_time(3i)"=>"1", "business_hours_attributes_4_opening_time(4i)"=>"09", "business_hours_attributes_4_opening_time(5i)"=>"00", "business_hours_attributes_4_closing_time(1i)"=>"2000", "business_hours_attributes_4_closing_time(2i)"=>"1", "business_hours_attributes_4_closing_time(3i)"=>"1", "business_hours_attributes_4_closing_time(4i)"=>"18", "business_hours_attributes_4_closing_time(5i)"=>"00", "business_hours_attributes_5_day_of_week"=>"5", "business_hours_attributes_5_opening_time(1i)"=>"2000", "business_hours_attributes_5_opening_time(2i)"=>"1", "business_hours_attributes_5_opening_time(3i)"=>"1", "business_hours_attributes_5_opening_time(4i)"=>"09", "business_hours_attributes_5_opening_time(5i)"=>"00", "business_hours_attributes_5_closing_time(1i)"=>"2000", "business_hours_attributes_5_closing_time(2i)"=>"1", "business_hours_attributes_5_closing_time(3i)"=>"1", "business_hours_attributes_5_closing_time(4i)"=>"18", "business_hours_attributes_5_closing_time(5i)"=>"00", "business_hours_attributes_6_day_of_week"=>"6", "business_hours_attributes_6_opening_time(1i)"=>"2000", "business_hours_attributes_6_opening_time(2i)"=>"1", "business_hours_attributes_6_opening_time(3i)"=>"1", "business_hours_attributes_6_opening_time(4i)"=>"09", "business_hours_attributes_6_opening_time(5i)"=>"00", "business_hours_attributes_6_closing_time(1i)"=>"2000", "business_hours_attributes_6_closing_time(2i)"=>"1", "business_hours_attributes_6_closing_time(3i)"=>"1", "business_hours_attributes_6_closing_time(4i)"=>"18", "business_hours_attributes_6_closing_time(5i)"=>"00"}, "commit"=>"Create Shop business hour form"} portfolio-web-1 | User Load (1.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 2], ["LIMIT", 1]] portfolio-web-1 | ↳ app/controllers/application_controller.rb:23:in `authenticate_admin!' portfolio-web-1 | Unpermitted parameters: :business_hours_attributes_0_day_of_week, :business_hours_attributes_0_opening_time(1i), :business_hours_attributes_0_opening_time(2i), :business_hours_attributes_0_opening_time(3i), :business_hours_attributes_0_opening_time(4i), :business_hours_attributes_0_opening_time(5i), :business_hours_attributes_0_closing_time(1i), :business_hours_attributes_0_closing_time(2i), :business_hours_attributes_0_closing_time(3i), :business_hours_attributes_0_closing_time(4i), :business_hours_attributes_0_closing_time(5i), :business_hours_attributes_1_day_of_week, :business_hours_attributes_1_opening_time(1i), :business_hours_attributes_1_opening_time(2i), :business_hours_attributes_1_opening_time(3i), :business_hours_attributes_1_opening_time(4i), :business_hours_attributes_1_opening_time(5i), :business_hours_attributes_1_closing_time(1i), :business_hours_attributes_1_closing_time(2i), :business_hours_attributes_1_closing_time(3i), :business_hours_attributes_1_closing_time(4i), :business_hours_attributes_1_closing_time(5i), :business_hours_attributes_2_day_of_week, :business_hours_attributes_2_opening_time(1i), :business_hours_attributes_2_opening_time(2i), :business_hours_attributes_2_opening_time(3i), :business_hours_attributes_2_opening_time(4i), :business_hours_attributes_2_opening_time(5i), :business_hours_attributes_2_closing_time(1i), :business_hours_attributes_2_closing_time(2i), :business_hours_attributes_2_closing_time(3i), :business_hours_attributes_2_closing_time(4i), :business_hours_attributes_2_closing_time(5i), :business_hours_attributes_3_day_of_week, :business_hours_attributes_3_opening_time(1i), :business_hours_attributes_3_opening_time(2i), :business_hours_attributes_3_opening_time(3i), :business_hours_attributes_3_opening_time(4i), :business_hours_attributes_3_opening_time(5i), :business_hours_attributes_3_closing_time(1i), :business_hours_attributes_3_closing_time(2i), :business_hours_attributes_3_closing_time(3i), :business_hours_attributes_3_closing_time(4i), :business_hours_attributes_3_closing_time(5i), :business_hours_attributes_4_day_of_week, :business_hours_attributes_4_opening_time(1i), :business_hours_attributes_4_opening_time(2i), :business_hours_attributes_4_opening_time(3i), :business_hours_attributes_4_opening_time(4i), :business_hours_attributes_4_opening_time(5i), :business_hours_attributes_4_closing_time(1i), :business_hours_attributes_4_closing_time(2i), :business_hours_attributes_4_closing_time(3i), :business_hours_attributes_4_closing_time(4i), :business_hours_attributes_4_closing_time(5i), :business_hours_attributes_5_day_of_week, :business_hours_attributes_5_opening_time(1i), :business_hours_attributes_5_opening_time(2i), :business_hours_attributes_5_opening_time(3i), :business_hours_attributes_5_opening_time(4i), :business_hours_attributes_5_opening_time(5i), :business_hours_attributes_5_closing_time(1i), :business_hours_attributes_5_closing_time(2i), :business_hours_attributes_5_closing_time(3i), :business_hours_attributes_5_closing_time(4i), :business_hours_attributes_5_closing_time(5i), :business_hours_attributes_6_day_of_week, :business_hours_attributes_6_opening_time(1i), :business_hours_attributes_6_opening_time(2i), :business_hours_attributes_6_opening_time(3i), :business_hours_attributes_6_opening_time(4i), :business_hours_attributes_6_opening_time(5i), :business_hours_attributes_6_closing_time(1i), :business_hours_attributes_6_closing_time(2i), :business_hours_attributes_6_closing_time(3i), :business_hours_attributes_6_closing_time(4i), :business_hours_attributes_6_closing_time(5i). Context: { controller: Admin::ShopsController, action: create, request: #, params: {"authenticity_token"=>"[FILTERED]", "shop_business_hour_form"=>{"shop_name"=>"テスト643", "address"=>"新潟県新発田市大栄町2-5-12", "phone_number"=>"", "duel_space_available"=>"", "opening_hours"=>"", "official_hp"=>"", "twitter"=>"", "instagram"=>"", "tag_list"=>"", "business_hours_attributes_0_day_of_week"=>"0", "business_hours_attributes_0_opening_time(1i)"=>"2000", "business_hours_attributes_0_opening_time(2i)"=>"1", "business_hours_attributes_0_opening_time(3i)"=>"1", "business_hours_attributes_0_opening_time(4i)"=>"11", "business_hours_attributes_0_opening_time(5i)"=>"00", "business_hours_attributes_0_closing_time(1i)"=>"2000", "business_hours_attributes_0_closing_time(2i)"=>"1", "business_hours_attributes_0_closing_time(3i)"=>"1", "business_hours_attributes_0_closing_time(4i)"=>"13", "business_hours_attributes_0_closing_time(5i)"=>"00", "business_hours_attributes_1_day_of_week"=>"1", "business_hours_attributes_1_opening_time(1i)"=>"2000", "business_hours_attributes_1_opening_time(2i)"=>"1", "business_hours_attributes_1_opening_time(3i)"=>"1", "business_hours_attributes_1_opening_time(4i)"=>"09", "business_hours_attributes_1_opening_time(5i)"=>"00", "business_hours_attributes_1_closing_time(1i)"=>"2000", "business_hours_attributes_1_closing_time(2i)"=>"1", "business_hours_attributes_1_closing_time(3i)"=>"1", "business_hours_attributes_1_closing_time(4i)"=>"18", "business_hours_attributes_1_closing_time(5i)"=>"00", "business_hours_attributes_2_day_of_week"=>"2", "business_hours_attributes_2_opening_time(1i)"=>"2000", "business_hours_attributes_2_opening_time(2i)"=>"1", "business_hours_attributes_2_opening_time(3i)"=>"1", "business_hours_attributes_2_opening_time(4i)"=>"09", "business_hours_attributes_2_opening_time(5i)"=>"00", "business_hours_attributes_2_closing_time(1i)"=>"2000", "business_hours_attributes_2_closing_time(2i)"=>"1", "business_hours_attributes_2_closing_time(3i)"=>"1", "business_hours_attributes_2_closing_time(4i)"=>"18", "business_hours_attributes_2_closing_time(5i)"=>"00", "business_hours_attributes_3_day_of_week"=>"3", "business_hours_attributes_3_opening_time(1i)"=>"2000", "business_hours_attributes_3_opening_time(2i)"=>"1", "business_hours_attributes_3_opening_time(3i)"=>"1", "business_hours_attributes_3_opening_time(4i)"=>"09", "business_hours_attributes_3_opening_time(5i)"=>"00", "business_hours_attributes_3_closing_time(1i)"=>"2000", "business_hours_attributes_3_closing_time(2i)"=>"1", "business_hours_attributes_3_closing_time(3i)"=>"1", "business_hours_attributes_3_closing_time(4i)"=>"18", "business_hours_attributes_3_closing_time(5i)"=>"00", "business_hours_attributes_4_day_of_week"=>"4", "business_hours_attributes_4_opening_time(1i)"=>"2000", "business_hours_attributes_4_opening_time(2i)"=>"1", "business_hours_attributes_4_opening_time(3i)"=>"1", "business_hours_attributes_4_opening_time(4i)"=>"09", "business_hours_attributes_4_opening_time(5i)"=>"00", "business_hours_attributes_4_closing_time(1i)"=>"2000", "business_hours_attributes_4_closing_time(2i)"=>"1", "business_hours_attributes_4_closing_time(3i)"=>"1", "business_hours_attributes_4_closing_time(4i)"=>"18", "business_hours_attributes_4_closing_time(5i)"=>"00", "business_hours_attributes_5_day_of_week"=>"5", "business_hours_attributes_5_opening_time(1i)"=>"2000", "business_hours_attributes_5_opening_time(2i)"=>"1", "business_hours_attributes_5_opening_time(3i)"=>"1", "business_hours_attributes_5_opening_time(4i)"=>"09", "business_hours_attributes_5_opening_time(5i)"=>"00", "business_hours_attributes_5_closing_time(1i)"=>"2000", "business_hours_attributes_5_closing_time(2i)"=>"1", "business_hours_attributes_5_closing_time(3i)"=>"1", "business_hours_attributes_5_closing_time(4i)"=>"18", "business_hours_attributes_5_closing_time(5i)"=>"00", "business_hours_attributes_6_day_of_week"=>"6", "business_hours_attributes_6_opening_time(1i)"=>"2000", "business_hours_attributes_6_opening_time(2i)"=>"1", "business_hours_attributes_6_opening_time(3i)"=>"1", "business_hours_attributes_6_opening_time(4i)"=>"09", "business_hours_attributes_6_opening_time(5i)"=>"00", "business_hours_attributes_6_closing_time(1i)"=>"2000", "business_hours_attributes_6_closing_time(2i)"=>"1", "business_hours_attributes_6_closing_time(3i)"=>"1", "business_hours_attributes_6_closing_time(4i)"=>"18", "business_hours_attributes_6_closing_time(5i)"=>"00"}, "commit"=>"Create Shop business hour form", "controller"=>"admin/shops", "action"=>"create"} } portfolio-web-1 | #<ActionController::Parameters {"shop_name"=>"テスト643", "address"=>"新潟県新発田市大栄町2-5-12", "phone_number"=>"", "duel_space_available"=>"", "opening_hours"=>"", "official_hp"=>"", "twitter"=>"", "instagram"=>"", "tag_list"=>"", "user_id"=>2} permitted: true>

kenchasonakai commented 1 month ago

ストロングパラメーター側を頑張るよりもform側で送る値をコントローラーで受け取りやすい値にするのがいいかもですね fields_forとか調べてみて何か良い形に出来ないか考えてみるのが良いかもです 解決につながるかはわかりませんがいくつか記事貼っておきます https://qiita.com/gotchane/items/6f595911333a8cf69c48 https://takaokouji.github.io/output/form-object/

taiti101112 commented 1 month ago

お忙しところありがとうございます! 確認いたしました🙇