質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

Q&A

解決済

1回答

1448閲覧

Railsでform_withフォームからcreateアクションにパラメータを渡したいが、エラーが出て渡せない。

yohei779904

総合スコア6

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

0グッド

0クリップ

投稿2020/03/10 20:24

前提・実現したいこと

Railsを勉強して半年程です。現在、簡易的な勤務管理できるシステムを作って学んでいます。
是非、教えていただきたいのですが、users/show.html.erbの14行目のform_with...のフォームを使用してattends_controller.rbcreateアクションに出勤のデータを渡そうとしているのですが、エラーがでて渡せないです。因みにこのフォームで渡したいデータは、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_pathuser_attends_path(@user)@user_attends_path(@user)のいずれも試してみましたがダメでした。

補足情報(FW/ツールのバージョンなど)

ruby 2.5.3
Rails 5.1.7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

url:"user_attends_path", と " で囲むのではなく
url: user_attends_path , としてください。
methodですの。

ただ気になるのが user_attends と複数形であること。
通常一つのobjectを対象にする new,show、create、update, delete は単数形になるものなのですが。rails routesでは複数形になってますね、、、

投稿2020/03/10 23:30

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohei779904

2020/03/11 03:56

コメントありがとうありがとうございます。また、ご迷惑をおかけいたします。 実は、```""```を外して、```url: user_attends_path```と記述すると、```ActionController::UrlGenerationError in Users#show```のエラーがでて、そのエラーの詳細は```No route matches {:action=>"index", :controller=>"attends", :id=>"1"}, missing required keys: [:user_id]```と出てしまうんです。ちなみに、パラメーターは```{"id"=>"1"}```としか表示されなくなってしまいます。 元の表記のパラメーターは```{"utf8"=>"✓", "authenticity_token"=>"KVCs1kDL5M/jGyO73CZO2MxX+WaBaVcJ074GKr25fPB9oj/LQPe7DlB9+RdFvI8ZUvVaxJBoCllhqvdglix+Ug==", "attend"=>{"in"=>"2020-03-11T12:54:41+09:00"}, "commit"=>"出勤"}```となるので問題はあまりないように見えます。
yohei779904

2020/03/11 04:00

すみません。マークダウン記法にて入力してしまいました。
winterboum

2020/03/11 04:57

すると user_attends GET /users/:user_id/attends(.:format) attends#index POST /users/:user_id/attends(.:format) attends#create これを信じないで url: user_attend_path , としてみてください。
yohei779904

2020/03/11 08:55

『 "" 』を付けずに、url: user_attend_pathとしてみました。 お伝えしたように、「ActionController::UrlGenerationError in Users#show」のエラーがでて、エラーの詳細は『 No route matches {:action=>"index", :controller=>"attends", :id=>"1"}, missing required keys: [:user_id] 』とでてしまいます。
Mugheart

2020/03/11 09:09

url: user_attends_path(@user) です。create への名前付きpathは複数形です。 エラーの原因は親リソースの引数が渡されてないためでしょう。
winterboum

2020/03/11 09:21

「create への名前付きpathは複数形です」   あ、そうでしたっけ。恥
yohei779904

2020/03/11 09:30

Mugheart様、コメントありがとうございます。 url: user_attends_path(@user)をして見ました。エラーにはなりますが、この方法だとパラメーターが『 authenticity_token"=>"KVCs1kDL5M/jGyO73CZO2MxX+WaBaVcJ074GKr25fPB9oj/LQPe7DlB9+RdFvI8ZUvVaxJBoCllhqvdglix+Ug==", "attend"=>{"in"=>"2020-03-11T12:54:41+09:00"}, "commit"=>"出勤 』となりました。親リソースの引数を加えることでパラメーターを渡せるようになりました。一歩進んだ気がします。ありがとうございます。 ちなみに、エラーが『 ActionController::UrlGenerationError in Attends#create 』となり、詳細は『 No route matches {:action=>"index", :controller=>"attends", :user_id=>nil}, missing required keys: [:user_id] 』となりました。親リソースの引数を加えない時との違いは、エラー表記の部分が『Attends#show』ではなく、『Attends#create』に変わりました。 ということは、Attendsコントローラのcreateアクションに問題があるのでしょうか。実は最終的には、コードは載せていませんが『attends/index.html.erb』の勤務表に出退勤の時間を表示させるつもりです。
yohei779904

2020/03/11 09:33 編集

winterboum様、 お手数かけて申し訳ございません。とても貴重な意見をお忙しい中ありがとうございます。それでも、とても参考になっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問