前提・実現したいこと
Railsを勉強して半年程です。現在、簡易的な勤務管理できるシステムを作って学んでいます。
是非、教えていただきたいのですが、users/show.html.erb
の14行目のform_with...
のフォームを使用してattends_controller.rb
のcreateアクション
に出勤のデータを渡そうとしているのですが、エラーがでて渡せないです。因みにこのフォームで渡したいデータは、worked_day(出勤日)
、in(出勤時間)
です。
エラーの内容では、No route matches [POST] "/users/user_attends_path"
とありますが、user_attends_path
は、routes.rb
、または、コマンドでrails routes
で調べても確認できます。
なにか原因があれば教えていただきたいです。どうぞよろしくお願い申し上げます。
下記が、コマンドでrails routes
で調べた内容です。
Prefix Verb URI Pattern Controller#Action root GET / toppages#index login GET /login(.:format) sessions#new POST /login(.:format) sessions#create logout DELETE /logout(.:format) sessions#destroy signup GET /signup(.:format) users#new user_attends GET /users/:user_id/attends(.:format) attends#index POST /users/:user_id/attends(.:format) attends#create new_user_attend GET /users/:user_id/attends/new(.:format) attends#new users POST /users(.:format) users#create new_user GET /users/new(.:format) users#new user GET /users/:id(.:format) users#show
発生している問題・エラーメッセージ
[ エラーメッセージ ] Routing Error No route matches [POST] "/users/user_attends_path"
該当のソースコード
ruby
1[ routes.rb ] 2 3Rails.application.routes.draw do 4 root to: 'toppages#index' 5 6 get 'login', to: 'sessions#new' 7 post 'login', to: 'sessions#create' 8 delete 'logout', to: 'sessions#destroy' 9 10 get 'signup', to: 'users#new' 11 12 resources :users, only: [:show, :new, :create] do 13 14 resources :attends, only: [:index, :new, :create] 15 end 16 17end
ruby
1[ models/attend.rb ] 2 3class Attend < ApplicationRecord 4 belongs_to :user 5 6 validates :worked_day, presence: true 7end
ruby
1[ models/user.rb ] 2 3class User < ApplicationRecord 4 5 has_many :attends, dependent: :destroy 6 7 before_save { self.email.downcase! } 8 validates :name, presence: true, length: { maximum: 50 } 9 validates :email, presence: true, length: { maximum: 255 }, 10 format: { with: /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i }, 11 12 uniqueness: { case_sensitive: false } 13 14 validates :basic_time, presence: true 15 16 has_secure_password 17 18 validates :password, presence: true, length: { minimum: 6 } 19
ruby
1[ application_controller.rb ] 2 3class ApplicationController < ActionController::Base 4 5 protect_from_forgery with: :exception 6 7 include SessionsHelper 8 9 $days_of_the_week = %w{日 月 火 水 木 金 土} 10 11 def set_one_month 12 @first_day = Date.current.beginning_of_month 13 @last_day = @first_day.end_of_month 14 one_month = [*@first_day..@last_day] # 1ヶ月分の日時を代入。 15 16 @attendances = current_user.attends.where(worked_day: @first_day..@last_day).order(:worked_day) 17 18 unless one_month.count == @attendances.count 19 ActiveRecord::Base.transaction do # トランザクションを開始。 20 21 one_month.each { |day| current_user.attends.create!(worked_day: day) } 22 end 23 @attendances = current_user.attends.where(worked_day: @first_day..@last_day).order(:worked_day) 24 end 25 26 rescue ActiveRecord::RecordInvalid 27 flash[:danger] = "ページ情報の取得に失敗しました、再アクセスしてください。" 28 redirect_to root_url 29 end 30 31 private 32 33 # ユーザーのログインを確認する 34 def logged_in_user 35 unless logged_in? 36 store_location 37 flash[:danger] = "ログインしてください。" 38 redirect_to login_url 39 end 40 end 41end
ruby
1[ migrate/schema.rb ] 2 3ActiveRecord::Schema.define(version: 20200308065643) do 4 5 create_table "attends", force: :cascade do |t| 6 t.date "worked_day" 7 t.datetime "in" 8 t.datetime "out" 9 t.integer "user_id" 10 t.datetime "created_at", null: false 11 t.datetime "updated_at", null: false 12 t.index ["user_id"], name: "index_attends_on_user_id" 13 end 14 15 create_table "users", force: :cascade do |t| 16 t.string "name" 17 t.string "email" 18 t.string "password_digest" 19 t.datetime "created_at", null: false 20 t.datetime "updated_at", null: false 21 t.string "remember_digest" 22 t.datetime "basic_time", default: "2020-03-07 23:00:00" 23 t.index ["email"], name: "index_users_on_email", unique: true 24 end 25 26end
ruby
1[ users/show.html.erb ] 2 3<div class="row"> 4 <div class="attendance_details"> 5 <div class="container bg-info"> 6 <div class="page-header"> 7 <h1><%= current_user.name %></h1> 8 <h1><%= Date.today %></h1> 9 <div class= "realtime"> 10 <script src="application.js"></script> 11 <h1><p id="RealtimeClockArea2"></p></h1> 12 </div> 13 </div> 14 15 </br> 16 17 <div class="col-xs-6"> 18 <%= form_with scope: :attend, url:"user_attends_path", local: true do |f| %> 19 <%= f.hidden_field :in, :value => DateTime.now %> 20 <%= f.submit '出勤', class: "btn btn-primary attend" %> 21 <% end %> 22 </div> 23 24 <div class="col-xs-6"> 25 <%= form_with scope: :attend, url:"user_attends_path", local: true do |f| %> 26 <%= f.hidden_field :out, :value => DateTime.now %> 27 <%= f.submit '退勤', class: "btn btn-default attend" %> 28 <% end %> 29 </div> 30 31 <div class="text-right"> 32 <%= link_to 'データ管理', user_attends_path(@user), class: "btn btn-default btn-lg active" %> 33 <%= link_to '終了', logout_path, method: :delete, class: "btn btn-default btn-lg active" %> 34 </div> 35 36 </div> 37 </div> 38</div> 39
ruby
1[ attends_controller.rb ] 2 3class AttendsController < ApplicationController 4 def new 5 @attend = Attend.new 6 end 7 8 def index 9 @first_day = Date.current.beginning_of_month 10 @last_day = @first_day.end_of_month 11 end 12 13 def create 14 @attend = Attend.new(attend_params) 15 16 if @attend.save 17 flash[:success] = '出勤が完了しました' 18 redirect_to @user 19 else 20 flash.now[:danger] = '登録に失敗しました。' 21 render 'users/show' 22 end 23 end 24 25private 26 27 def attend_params 28 params.require(:attend).permit(:worked_day, :in, :out) 29 end 30 31end
試したこと
current_user_attends_path
、user_attends_path(@user)
、@user_attends_path(@user)
のいずれも試してみましたがダメでした。
補足情報(FW/ツールのバージョンなど)
ruby 2.5.3
Rails 5.1.7
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/11 03:56
2020/03/11 04:00
2020/03/11 04:57
2020/03/11 08:55
2020/03/11 09:09
2020/03/11 09:21
2020/03/11 09:30
2020/03/11 09:33 編集