rails enumで曜日選択したい
Q&A
Closed
解決したいこと
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