maasiii
@maasiii

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

rails enumで曜日選択したい

解決したいこと

ruby on railsでお店の定休日を選択できる機能を実装中です。
解決したいことは、曜日を選択した時に発生するArgumentErrorを解決したいです。
曜日はenumで作成しています。

環境:
rails7
docker3.9

発生している問題・エラー

ArgumentError in AgentsController#update
'["月"]' is not a valid day_of_week
Extracted source (around line #10):
8
9
10
11
12
13
              
  def update
    @agent = Agent.find(params[:id])
    if @agent.update(agent_params)
      params[:agent][:phone_number] = format_phone_number(params[:agent][:phone_number])
      redirect_to edit_agent_path(@agent)


Rails.root: /myapp

Application Trace | Framework Trace | Full Trace
app/controllers/agents_controller.rb:10:in `update'
Request
Parameters:

{"_method"=>"patch",
 "authenticity_token"=>"[FILTERED]",
 "agent"=>
  {"name"=>"株式会社Qiita",
   "phone_number"=>"080-0000-0000",
   "email"=>"example-1@example.com",
   "postal_code"=>"000-0000",
   "prefecture"=>"東京都",
   "city"=>"新宿区",
   "town"=>"西新宿",
   "house_number"=>"1-1-1",
   "building_name"=>"",
   "start_at"=>"2000-01-01 10:00:00 +0900",
   "end_at"=>"2000-01-01 19:00:00 +0900",
   "holidays_attributes"=>{"0"=>{"day_of_week"=>["月"]}}},
 "commit"=>"更新する",
 "id"=>"1"}

該当するソースコード

views/agents/edit.html.erb
<p>ユーザー情報の編集</p>
<div class="container d-flex">
<%= form_with(model: @agent, class: "row") do |f| %>
  <%= f.label :代理店名 %>
  <%= f.text_field :name %>
  <%= render_field_with_error(f, :name) %>

  <%= f.label :電話番号 %>
  <%= f.text_field :phone_number %>
  <%= render_field_with_error(f, :phone_number) %>

  <%= f.label :メールアドレス %>
  <%= f.text_field :email %>
  <%= render_field_with_error(f, :email) %>

  <button type="button", id="searchBtn", class="btn btn-primary">住所検索</button>
  <%= f.label :郵便番号 %>
  <%= f.text_field :postal_code, id: "input_zip", placeholder: "※半角・ハイフン有り" %>
  <%= render_field_with_error(f, :postal_code) %>

  <%= f.label :住所 %>
  <%= f.label :都道府県 %>
  <%= f.text_field :prefecture, id: "input_state" %>
  <%= render_field_with_error(f, :prefecture) %>

  <%= f.label :市区町村 %>
  <%= f.text_field :city, id: "input_city" %>
  <%= render_field_with_error(f, :city) %>

  <%= f.label :町域名%>
  <%= f.text_field :town, id: "input_town" %>
  <%= render_field_with_error(f, :town) %>

  <%= f.label :丁目・番地・号 %>
  <%= f.text_field :house_number %>
  <%= render_field_with_error(f, :house_number) %>

  <%= f.label :建物名 %>
  <%= f.text_field :building_name %>

  <%= f.label :営業時間 %>
  <div class="d-flex">
  <%= f.text_field :start_at %>
  <%= render_field_with_error(f, :start_at) %>
  <%= f.text_field :end_at %>
  <%= render_field_with_error(f, :end_at) %>
  </div>

    <%= f.fields_for :holidays do |holiday| %>
      <%= holiday.label :day_of_week %>
      <%= holiday.collection_check_boxes :day_of_week, Holiday.day_of_weeks.keys, :to_sym, :to_s, include_hidden: false %>
    <% end %>

  <%= f.submit %>
<% end %>

</div>
agent.rb
class Agent < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
          :validatable, :recoverable
  include Discard::Model

  VALID_PHONE_NUMBER_REGEX = /\A(0([0-9]-[0-9]{4}|[0-9]{2}-[0-9]{3}|[0-9]{3}-[0-9]{2}|[0-9]{4}-[0-9])-[0-9]{4}|0[789]0-[0-9]{4}-[0-9]{4})\z/
  validates :phone_number, presence: true, format: { with: VALID_PHONE_NUMBER_REGEX }
  validates :name, presence: true
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: true
  VALID_POSTAL_CODE_REGEX = /\A\d{3}-\d{4}\z/
  validates :postal_code, presence: true, format: { with: VALID_POSTAL_CODE_REGEX }
  validates :start_at, presence: true
  validates :end_at, presence: true
  validates :prefecture, presence: true
  validates :city, presence: true
  validates :town, presence: true
  validates :house_number, presence: true

  has_many :holidays
  accepts_nested_attributes_for :holidays

end

holiday.rb
class Holiday < ApplicationRecord
  enum :day_of_week, { : 0, : 1, : 2, : 3, : 4, : 5, : 6, : 7 }, suffix: true

  belongs_to :agent
end

agents_controller.rb
class AgentsController < ApplicationController

  def edit
    @agent = Agent.find(params[:id])
    @agent.holidays.build
  end

  def update
    @agent = Agent.find(params[:id])
    if @agent.update(agent_params)
      params[:agent][:phone_number] = format_phone_number(params[:agent][:phone_number])
      redirect_to edit_agent_path(@agent)

    else
      render :edit, status: :unprocessable_entity
    end
  end

  private

  def agent_params
    params.require(:agent).permit(
      :name, :email, :encrypted_password,
      :postal_code, :phone_number, :start_at, :end_at,
      :prefecture, :city, :town, :house_number, :building_name,
      holidays_attributes: [:agent_id, :day_of_week => []]
    )
  end

  def format_phone_number(phone_number)
    phone_number.gsub(/(\d{3})(\d{4})(\d{4})/, '\1-\2-\3')
  end
end

routes.rb
Rails.application.routes.draw do

  devise_for :users
  devise_for :agents

  root 'users#index'
  resources :agents do
    resources :holidays
  end
end

自分で試したこと

自分で試したことといえば、
viewファイルのボタンをさまざまな書き方をしてみた程度ですが、viewの問題ではないのでは?と思い、パラメータにholidaysのagent_idを含めていなかったので、agent_idを記述するも変わらず、
自身では解決に時間を使いすぎると判断し質問させていただきました。
お解りになる方いましたら、ご教授いただける幸いです🙇

0

1Answer

以下を見る限りでは、enum :day_of_weekでエラーが発生しているのでは?

'["月"]' is not a valid day_of_week

月など日本語を使用していることもエラーの原因かもしれませんね。monなどに変更してはいかがでしょうか。

1Like

Comments

  1. @maasiii

    Questioner

    @jinbei230525
    返信ありがとうございます!
    引数が間違っているということでしょうか?

  2. 引数というより、enum :day_of_weekを定義しているところで、エラーなのでは?

    Railsのenumの定義で、日本語って、そもそも使用できるのでしょうか???

  3. @maasiii

    Questioner

    なるほどです!
    定義を変えてみます🙇

Your answer might help someone💌