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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Q&A

解決済

2回答

657閲覧

wrong number of arguments (given 4, expected 3)

gnash

総合スコア1

Ruby

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

0グッド

0クリップ

投稿2022/10/18 07:53

rails wrong number of arguments (given 4, expected 3)

railsにて架空のECサイトを作成しています。
railsチュートリアルにてログイン機能を実装し、その後に商品登録画面を作成しているところ
下記のエラーが出て原因が突き止めることができなくなっているため助言いただきたいです。
初心者のため簡単なミスの可能性ありますが何卒よろしくお願いします。
エラー内容は下記になります。

ArgumentError in Top#new Showing /Users/#名> 名前の為伏せます/stock_practice/app/views/top/new.html.erb where line #11 raised: wrong number of arguments (given 4, expected 3) Extracted source (around line #11): <!--入力画面--> <%= form_with model:@item, url:{action: 'create'} do |f| %> <%= f.label :product_name, "商品名" %> <%= f.text_field :product_name, required: true %> <%= f.label :arrival_source, "入荷元" %> Rails.root: /Users/kokimoriguchi/stock_practice Application Trace | Framework Trace | Full Trace app/views/top/new.html.erb:11 Request Parameters: None Toggle session dump Toggle env dump

該当のソースコード

**TOPコントローラー** class TopController < ApplicationController def index @item = Item.all end def new @item = Item.new @log = Log.new end def create #<!--入力画面--> @item = Item.new(item_params) if @item.save redirect_to confirm_path else flash.now[:alert] = '登録に失敗しました' @item = Item.new(item_params) render action: :index end end def confirm #<!--確認画面--> @item = Item.new(item_params) @log = Log.new(log_params) if @log.save redirect_to complete_path else flash.now[:alert] = '登録に失敗しました' @item = Item.new(item_params) @log = Log.new(log_params) end end def back end def edit end private def item_params params.permit(:product_name, :arrival_source, :manufactuer,) end def log_params params.require(:log).permit(:email, :tel) end end ~~打ち消し線~~ **top/new.html.erb** <h1>新規商品登録</h1> <p>必要事項を記入してください</p> <ul class="nav"> <li class="current">1.入力</li> <li>2.確認</li> <li>3.完了</li> </ul> <!--入力画面--> <%= form_with model:@item, url:{action: 'create'} do |f| %> <%= f.label :product_name, "商品名" %> <%= f.text_field :product_name, required: true %> <%= f.label :arrival_source, "入荷元" %> <%= f.text_field :arrival_source, required: true %> <%= f.label :manufactuer, "製造元" %> <%= f.text_field :manufactuer, required: true %> <%= f.submit "確認画面へ", class: "btn btn-primary" %> <% end %> <!--確認画面--> <!--完了画面--> ~~打ち消し線~~ **model/item.rb** class Item < ApplicationRecord include ActiveModel::Model include ActiveModel::Attributes with_options presence: true do validates :product_name, presence: true validates :arrival_source, presence: true validates :manufactuer, presence: true end def create @item = params[:item].permit(:product_name, :arrival_source, :manufactuer, :price) Item.create(@item) end end

試したこと

form_withの部分でのmodel@:itemを削除するとviewは実装され送信できるがDBの指定がないため保存がされない。
しかしこの記述をすると引数が合わないというエラーが出てしまい表示されない。
他の方々の質問等確認し色々試しましたがどれも合わず、、、
残り考えられるのがrailsチュートリアルで作成したクッキーなどが、
引数として残っているのかなど考えることしかできず、、、
お力をお借りしたいです。よろしくお願いします。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2022/10/18 09:15

質問本文からエラーそのものについて調べたかどうかが言及されていませんが、実際のところ如何でしょうか。
winterboum

2022/10/18 12:46

line #11 って <%= form_with model:@item, url:{action: 'create'} do |f| %> ですか?
no1knows

2022/10/19 04:37

>名前の為伏せます ...やるなら確実に!!
m.ts10806

2022/10/19 04:51

質問削除リクエストして投稿しなおしですね。編集では履歴から観れるから。
gnash

2022/10/20 04:18

皆様ご指摘等ありがとうございます。 まだまだ知識不足の為言語化が難しく拙い回答になりますがご容赦ください。 m.ts10806様 皆様の調べるのレベルに比べるとまだまだだと思いますが調べました。 現状の予測されている引数と与えている引数の差異について自身ではfrom_withの部分で3つの引数を与えているつもりなのですが4つ与えていることになっており、その余剰している引数が何かがわからず質問させていただきました。現在はviewの部分等一から作り直し別のエラーが起きてしまっているのですが、、、 また投稿し直しのコメントに関してご質問なのですが、このサイトの利用が初めてで使い方等まだ完全に理解しておらず、この投稿は削除した方がよろしいのでしょうか? winterboum様 はい。その通りです。ネットで調べ納得し、form_withを初めて使用しているのですがうまくいかず自身では引数を3つ与えているつもりが4つ与えていることになっておりその余剰している引数がわからず困っております。 no1knows様 ご指摘ありがとうございます。 完全独学で今まで学んでおりコードに対しての質問をさせてもらうことが初めてで不完全で申し訳ありません。よければご教授いただきたいのですが該当の部分は自己判断で本件には関係性の薄い部分かと思い伏せさせて頂いたのですが、質問する際は自身の名前等の個人情報が載っていても全て見せなければ問題解決の障害になりうるのでしょうか?
no1knows

2022/10/20 04:32

まぎらわしくてごめんなさい。 ご提示いただいているコードの他のところで伏せていなかったので、気になってコメントしてしまいました。 コードを見るとmodel/item.rbにもcreateメソッドを記載しているように見えるのですが、その前提はあっていますか?
gnash

2022/10/20 05:09

no1knows様 こちらこそ不完全で申し訳ないです、、、 はい。その通りです。最初createメソッドに飛ばすことができず試行錯誤していた時にこの記述をしているものを発見したため記述しています。正直なところmodel/item.rbへのcreateメソッドの記載の必要理由は理解できていないです。
gnash

2022/10/20 05:40

追記します。model/item.rbに記述していたinclude ActiveModel::Attributesをコメントアウトすれば本件のエラーは出なくなりました。しかし依然としてDBに保存はされない状態です。 includeしていたモジュールに問題があり引数が合わない原因なのかと考えたのですが違いあれば併せてご指摘いただけると幸いです。
guest

回答2

0

自己解決

コントローラー名をモデル名と同じitemsに変更しルート等全て見直しすることで解決しました。
railsの標準機能のnewアクションを呼び出し、引数が空ならcreateアクションに自動に飛ぶ機能をモデルとコントローラーの命名が違うためややこしくしてしまっていたようです。
今回の機能を使うのであれば継承をしっかり行う必要があるようでした。
初めての質問で言葉足らず説明足らずでしたが、コメントいただけた皆様ありがとうございました。
独学のため、一緒に問題を考えてくれる人がいるというだけでも頭が落ち着き考えることができました。
ありがとうございました!!!!!!!

投稿2022/10/20 17:29

gnash

総合スコア1

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

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

0

new.html.erb line #11 が <%= form_with model:@item, url:{action: 'create'} do |f| %> だとすると ??? なのです。
私には 引数一つに見える<%= form_with( model:@item, url:{action: 'create'} }) do |f| %> ってことですから。

form_with で model: と url: 2つ指定する人多いのだけど、ItemsController の create に飛ばすなら
<%= form_with model:@item do |f| %> の方が間違いないです。
一度これで試してください。

投稿2022/10/20 07:51

winterboum

総合スコア23329

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

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

gnash

2022/10/20 09:37

winterboum様 コメントありがとうございます。 上記記述に変更しましたが同様のエラーが出てしまいます。 追記した通り、model/item.rbに記述していたinclude ActiveModel::Attributesをコメントアウトすれば本件のエラーは出なくなりました。その後、<%= form_with model:@item do |f| %>の記述のまま動作確認するとcreateアクションが呼び出されない状況になります。
winterboum

2022/10/20 10:37

え〜〜〜 class Item < ApplicationRecord なのですから include ActiveModel::Model include ActiveModel::Attributes は要らないのでは?
winterboum

2022/10/20 10:40

createアクションが呼び出されない状況 と否定形だと情報無いです どうなりました?
gnash

2022/10/20 14:03

winterboum様 今一度調べ直して理解しました。ご指摘ありがとうございます。 説明不足で申し訳ないです。 現在はターミナルにて下記エラーが出ている状態です。 ルートがおかしいみたいです、、、 エラー文 Started POST "/items" for ::1 at 2022-10-20 22:53:59 +0900 ActionController::RoutingError (uninitialized constant ItemsController Object.const_get(camel_cased_word) ^^^^^^^^^^ raise MissingController.new(error.message, error.name) ^^^^^): route.rb Rails.application.routes.draw do #商品登録一覧ルート get 'top/index' => 'top#index' get 'top/show' get 'top/new' => 'top#new' post 'top/create' => 'top#create' get 'top/edit' post 'create' => 'top#create' get 'confirm' => 'top#confirm' # 確認画面 post 'top/back' # 確認画面から「入力画面に戻る」をクリックしたとき post 'top/complete' # 完了画面 #ホーム画面ルート root 'stock_practice#home' get 'stock_practice/home' get 'contact' => 'contact#contact' get 'about' => 'stock_practice#about' get 'help' => 'stock_practice#help' #ログイン関係ルート get 'sessions/new' get 'login' => 'sessions#new' post 'login' => 'sessions#create' delete 'logout' => 'sessions#destroy' get 'signup' => 'users#new' resources :top resources :users resources :items, only: [:index, :new, :create, :confirm, :back, :edit] resources :logs, only: [:edit, :update, :create, :destroy] resources :contacts, only: [:new, :create] # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html # Defines the root path route ("/") # root "articles#index" end
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問