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

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

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

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

Ruby

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

Ruby on Rails

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

Q&A

3回答

4232閲覧

【Rails】updateアクション時にupdateメソッドの引数が合わない問題について

k_yusuke

総合スコア19

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/08/23 01:41

編集2022/01/12 10:55

いつもお世話になっております。今回もよろしくおねがいします。
タイトルの通り、users_controller内のupdateアクションにおいて、updateメソッドの引数が合わず困っています。「引数に代入しているuser_paramsが引数としてカウントされていないのではないか?」と仮説をたてたのですが、この認識で間違いないでしょうか?
また、一応確認のためupdate_attributesメソッドも使ってみましたが結果は同じでした。
お知恵をお貸しください

発生している問題・エラーメッセージ

Started PATCH "/users/32" for 160.15.13.173 at 2019-08-23 01:24:10 +0000 Cannot render console from 160.15.13.173! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by UsersController#update as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"jzaJrmNU2WBiYVTMDt6R/Alfm5qnFh4aATnMU77xX4dHZQR+GIfVqrHz5whFTIh4f3I14jo7CTgsE750Lzl1qw==", "user"=>{"username"=>"yusuke", "email"=>"yusuke@yahoo.com", "password"=>"[FILTERED]"}, "commit"=>"更新する", "id"=>"32"} User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 32], ["LIMIT", 1]] (0.1ms) begin transaction (0.1ms) rollback transaction Completed 500 Internal Server Error in 79ms (ActiveRecord: 0.4ms) ArgumentError (wrong number of arguments (given 0, expected 1)): app/controllers/users_controller.rb:31:in `update'

該当のソースコード

app/controssler/users_controller.rb(省略なし・全文)

# frozen_string_literal: true class UsersController < ApplicationController before_action :check_user_login?, only: [:show] def new @user=User.new end def create @user=User.new(user_params) if @user.save current_user = @user redirect_to root_path else #パラムスを持つユーザー render new_user_path end end def edit user_find_by_id end def update user_find_by_id binding.pry if @user.update(user_params) redirect_to user_path(id: current_user.id) else render edit_user_path end end def destroy user_find_by_id @user.destroy end def show user_find_by_id @tours = Tour.where(user_id: @user.id) end def followings user_find_by_id @users = @user.followings.page(params[:page]) render 'follow' end def followers user_find_by_id @users = @user.followers.page(params[:page]) render 'follow' end def favorite @tours = current_user.favtours.page(params[:page]) end private def user_find_by_id @user = User.find_by(id: params[:id]) end def user_params params.require(:user).permit(:username,:email, :password, :password_confirmation,:user_image) end end

app/model/user.rb

# frozen_string_literal: true class User < ApplicationRecord has_many :tours, dependent: :destroy has_many :comments, dependent: :destroy has_many :likes, dependent: :destroy has_many :liked_tours, through: :likes, source: :tour has_many :favorites has_many :favtours, through: :favorites, source: :tour has_many :relationships has_many :followings, through: :relationships, source: :follow has_many :reverse_of_relationships, class_name: 'Relationship', foreign_key: 'follow_id' has_many :followers, through: :reverse_of_relationships, source: :user devise :database_authenticatable, :recoverable, :rememberable, # :validatable, :registerable, :omniauthable mount_uploader :userimage, UserimageUploader has_one_attached :user_image def update_without_current_password(params, *options) params.delete(:current_password) result = update_attributes(params, *options) clean_up_passwords result end end

app/views/user/edit.html.haml

%h3 ユーザー編集ページ = simple_form_for(@user) do |f| = f.error_notification .form-inputs = f.input :username, required: true, autofocus: true, input_html: { autocomplete: "username",class:"form-control" } = f.input :email, required: true, autofocus: true, input_html: {class:"form-control" } = f.input :password, hint: "leave it blank if you don't want to change it", required: false, input_html: { autocomplete: "new-password",class:"form-control" } = f.input :user_image, as: :file, input_html: { class:"mb-3" } .form-actions = f.button :submit, "更新する" %p.mt-3 #{link_to "アカウントを削除する","users/#{@user.id}", data: { confirm: "Are you sure?" }, method: :delete} = link_to "キャンセル", root_path

###追記(binding.pryを使った行の可視化、上記のusers_controller.rbにも追記あり)

From: /home/ec2-user/environment/new_app2/app/controllers/users_controller.rb @ line 32 User sController#update: 29: def update 30: user_find_by_id 31: binding.pry#(実際にはこの行は挿入されていないので、↓のif行が31行目になります) => 32: if @user.update(user_params) 33: redirect_to user_path(id: current_user.id) 34: else : この場合のエラーメッセージは ArgumentError (wrong number of arguments (given 0, expected 1)): app/controllers/users_controller.rb:32:in `update' でした

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

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

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

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

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

guest

回答3

0

各種コントローラ内でdeviseメソッドが呼ばれていないので問題ないかなと考えていたのですが...

gem は実装次第では Rails起動時に上書きできますし、他にも親の ApplicationController で宣言していたら適用されるので問題ないと判断するには少し弱いかもしれません

binding.pry で止めた後に $ を使うとその関数の定義が見えるので、確認してみてはどうでしょう?

何も問題なければこのようにActiveRecordの定義が見えるはず
イメージ説明

投稿2019/08/26 07:01

Ighrs

総合スコア656

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

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

0

app/controllers/users_controller.rb:31:in `update'
って
render edit_user_path
ですか?
render edit_user_path @user

ですね

投稿2019/08/23 01:48

winterboum

総合スコア23284

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

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

k_yusuke

2019/08/23 02:11

winterboumさん回答ありがとうございます。いつもお世話になってます app/controllers/users_controller.rb:31:in `update'の位置追記しました!! 不要な部分を省略しようとして紛らわしい書き方になってしまいましたすみません
guest

0

おそらくですが、edit_user_pathが引数不足となっているのではないかと思われます(users_controller.rb:31(31行目)とエラーの場所が明記されていますが、それはどこでしょうか)。

投稿2019/08/23 01:47

maisumakun

総合スコア145121

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

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

k_yusuke

2019/08/23 02:12

maisumakunさん回答ありがとうございます。いつもお世話になってます app/controllers/users_controller.rb:31:in `update'の位置追記しました!! 不要な部分を省略しようとして紛らわしい書き方になってしまいましたすみません
winterboum

2019/08/23 02:27

それは??? 開示したエラーメッセージが出た時と、行数数えてた時までの間に編集していませんか?
k_yusuke

2019/08/23 02:55

返信ありがとうございます。理解力が足らずwinterborumさんの意図を把握できているかわからないですが、users_controller.rbの全文とbinding.pryを使って行をわかりやすく追記してみました。 まだ情報が不足しているようなら教えて下さい
winterboum

2019/08/23 03:43

うわ、、、、ここですか。判らん。 maisumakunさん、これは一体何事なんでしょう。
Mugheart

2019/08/23 04:29

deviseのドキュメントを読んでその通りに編集、アップデート機能を実装すればこんなことにはならないと思います。 devise嫌いで使ってないのでアレですけど、メソッドがdeviseによってオーバーライドされてるとかが原因じゃないですか?
Mugheart

2019/08/23 04:31 編集

要はコントローラと送信先(URL)が違うと思うんですよね、確か registrations_controller みたいなやつだったと思うんですが。
k_yusuke

2019/08/23 04:45

mugheartさん回答ありがとうございます おっしゃるとおり、元々registrations_controller 内のcreateアクションやupdateアクションを使っていたのですが、usersコントローラ自体でcreate,updateアクションを使うために移行しました。 今はregistrations_controllerはすべてコメントアウトしています。 メソッドがオーバーライドされた可能性なんですが、各種コントローラ内でdeviseメソッドが呼ばれていないので問題ないかなと考えていたのですが。。。 再度添付して頂いたドキュメントを細部まで読み込んでみます
Mugheart

2019/08/23 05:00

うーん、そうですか...。 使ったことがないので問題ないと言われるとそれ以上何も言えないですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問