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

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

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

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

Ruby on Rails

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

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

Q&A

解決済

1回答

1584閲覧

formオブジェクトでedit、update機能を実装したい

Mo.mi

総合スコア4

Ruby

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

Ruby on Rails

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

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

0グッド

0クリップ

投稿2021/12/18 15:38

編集2021/12/19 03:34

前提・実現したいこと

お世話になります。
formオブジェクトを使ったnew、create実装後、こちら(https://qiita.com/tanutanu/items/5ff5f1e653d802929f0b)の記事を参考にedit、updateを実装しようと思いましたが、下記のエラーが出てしまいました。
理解が浅くうまく自分の状況に合わせた置き換えができていないからだと思うのですが、どのように修正すればよろしいでしょうか、、、。

どうぞよろしくお願い致します。

エラーメッセージ

ArgumentError in ActorsController#edit
wrong number of arguments (given 0, expected 1..2)
Extracted source (around line #14):

end def initialize(user, params = {}, actor: '') @actor_nextprogram ||= ActorNextprogram.new @actor_nextprogram.assign_attributes({comment: params[:comment], user_id: params[:user_id], schedule: params[:schedule], show: params[:show], stage: params[:stage], author: params[:author], actor_id: params[:actor_id]}) super(params)

def initialize(user, params = {}, actor: '')
がエラーになっている14行目です。

該当のソースコード

ruby

1class ActorsController < ApplicationController 2 3 def new 4 @actor_nextprogram = ActorNextprogram.new 5 end 6 7 def create 8 @actor_nextprogram = ActorNextprogram.new(actor_params) 9 if @actor_nextprogram.valid? 10 @actor_nextprogram.save 11 @actor = Actor.where(user_id: current_user.id).pluck(:id) 12 redirect_to user_actor_path(current_user.id, @actor) 13 else 14 render :new 15 end 16 end 17 18 def show 19 #略 20 end 21 22 def edit 23 @actor = Actor.find(params[:id]) 24 @actor_nextprogram = ActorNextprogram.new(current_user, actor: @actor) 25 end 26 27 def update 28 @actor = Actor.find(params[:id]) 29 @actor_nextprogram = ActorNextprogram.new(current_user, actor_params, actor: @actor) 30 if @actor_nextprogram.save! 31 redirect_to root_path 32 else 33 render :edit 34 end 35 end 36 37 private 38 39 def actor_params 40 params.require(:actor_nextprogram).permit(:comment, :image, :schedule, :show, :stage, :author).merge(user_id: current_user.id) 41 end 42 43end

↓actors/edit.html.erb

ruby

1<div> 2 <%= form_with model:@actor_nextprogram, url:user_actor_path, method: :patch, local: true do |f| %> 3 4 <%= render 'shared/error_messages',{ model: f.object} %> 5 <div class="actor"> 6 <div class="form"> 7 <div class="form-content"> 8 <div class="form-lavel"> 9 画像(必須) 10 </div> 11 <%= f.file_field :image, class:"actor-image" %> 12 </div> 13 14 <div class="form-content"> 15 <div class="form-lavel"> 16 コメント 17 </div> 18 <%= f.text_area :comment, class:"comment" %> 19 </div> 20 </div> 21 </div> 22 23 <div class="nextprogram"> 24 <div class="form"> 25 <div class="form-content"> 26 <div class="form-lavel"> 27 日程 28 </div> 29 <div class="schedule"> 30 <%= f.text_field :schedule, placeholder:"例)2021/01/13" %> 31 </div> 32 </div> 33 34 <div class="form-content"> 35 <div class="form-lavel"> 36 公演名 37 </div> 38 <%= f.text_field :show, class:"program" %> 39 </div> 40 41 <div class="form-content"> 42 <div class="form-lavel"> 43 作品名 44 </div> 45 <%= f.text_field :stage, class:"program" %> 46 </div> 47 48 <div class="form-content"> 49 <div class="form-lavel"> 50 作・演出 51 </div> 52 <%= f.text_field :author, class:"program" %> 53 </div> 54 </div> 55 56 <div class="actions"> 57 <%= f.submit "送信する", class: :form__btn %> 58 </div> 59 60 <% end %> 61</div>

↓formオブジェクト

ruby

1class ActorNextprogram 2 include ActiveModel::Model 3 attr_accessor :comment, :user_id, :image, :schedule, :show, :stage, :author, :actor_id 4 5 with_options presence: true do 6 #略 7 end 8 9 def initialize(user, params = {}, actor: '') 10 @actor_nextprogram ||= ActorNextprogram.new 11 @actor_nextprogram.assign_attributes({comment: params[:comment], user_id: params[:user_id], schedule: params[:schedule], show: params[:show], stage: params[:stage], author: params[:author], actor_id: params[:actor_id]}) 12 super(params) 13 end 14 15 def to_model 16 @actor 17 end 18 19 def save! 20 return false if invalid? 21 @actor.nextprogram.build(actor: actor).save! 22 23 @actor.save! ? true : false 24 end 25end

↓ルーティング

ruby

1Rails.application.routes.draw do 2 devise_for :users 3 root to: "users#index" 4 resources :users, only: [:index, :show] do 5 resources :questions, only: [:new, :create, :edit, :update] 6 resources :actors, only: [:show, :new, :create, :edit, :update] 7 end 8end

↓不要かもしれませんが、actors/new.html.erb

ruby

1<div> 2 <%= form_with model:@actor_nextprogram, url:user_actors_path, local: true do |f| %> 3 4 <%= render 'shared/error_messages',{ model: f.object} %> 5 <div class="actor"> 6 <div class="form"> 7 <div class="form-content"> 8 <div class="form-lavel"> 9 画像(必須) 10 </div> 11 <%= f.file_field :image, class:"actor-image" %> 12 </div> 13 14 <div class="form-content"> 15 <div class="form-lavel"> 16 コメント 17 </div> 18 <%= f.text_area :comment, class:"comment" %> 19 </div> 20 </div> 21 </div> 22 23 <div class="nextprogram"> 24 <div class="form"> 25 <div class="form-content"> 26 <div class="form-lavel"> 27 日程 28 </div> 29 <div class="schedule"> 30 <%= f.text_field :schedule, placeholder:"例)2021/01/13" %> 31 </div> 32 </div> 33 34 <div class="form-content"> 35 <div class="form-lavel"> 36 公演名 37 </div> 38 <%= f.text_field :show, class:"program" %> 39 </div> 40 41 <div class="form-content"> 42 <div class="form-lavel"> 43 作品名 44 </div> 45 <%= f.text_field :stage, class:"program" %> 46 </div> 47 48 <div class="form-content"> 49 <div class="form-lavel"> 50 作・演出 51 </div> 52 <%= f.text_field :author, class:"program" %> 53 </div> 54 </div> 55 56 <div class="actions"> 57 <%= f.submit "送信する", class: :form__btn %> 58 </div> 59 60 <% end %> 61</div>
Prefix Verb URI Pattern Controller#Action user_actors POST /users/:user_id/actors(.:format) actors#create new_user_actor GET /users/:user_id/actors/new(.:format) actors#new edit_user_actor GET /users/:user_id/actors/:id/edit(.:format) actors#edit user_actor GET /users/:user_id/actors/:id(.:format) actors#show PATCH /users/:user_id/actors/:id(.:format) actors#update PUT /users/:user_id/actors/:id(.:format) actors#update users GET /users(.:format) users#index user GET /users/:id(.:format) users#show

先日、winterboum様からのご回答により、form_withのurl指定が不要であること、ビューファイルも1つにまとめられることを学ばせていただきましたが、formオブジェクトが自動的で飛ばしてくれるパスは複数形のみとの記事も読み、分けて作ってみています。ですが、上記参考記事ですと、formオブジェクトでもまとめられるようですので、このあたりも理解不足と認識しております、、、。

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

ruby 2.6.5p114
rails 6.0.0

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

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

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

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

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

winterboum

2021/12/18 21:13

エラーメッセージは省略しないで全部載せるようにしてください
Mo.mi

2021/12/19 03:35

大変失礼致しました。 修正しましたので、どうぞよろしくお願い致します。
winterboum

2021/12/19 05:13

Extracted source (around line #14): とありますが、14行目はどこでしょう
Mo.mi

2021/12/19 06:14

エラーメッセージ下部に書かせていただいております def initialize(user, params = {}, actor: '') この部分になります。
guest

回答1

0

ベストアンサー

エラーメッセージの下に書かれているのが、どのfileなのかがわからない。質問文を丁寧に読めばわかったけど、回答者にそんな苦労させないで。
それと14行目そこでは無いでしょう。その1行下では?
@actor_nextprogram ||= ActorNextprogram.new と自分自身をまた呼んでますが、この new に引数がない、と言ってます。

で、
そこに適切な引数をつければそのエラーはなくなりますが、別のエラーがでますね、きっと。

投稿2021/12/19 07:33

winterboum

総合スコア23567

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

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

Mo.mi

2021/12/19 09:43

大変失礼致しました。 エラーを改めて確認いたしましたが、エラーと表示されている14行目はやはり「def initialize(user, params = {}, actor: '')」の部分でした。 また、ご指摘いただいたnewに引数を入れたところ、おっしゃるとおり今度は別のエラーが出てしまいました。 さらに、再検討したところそもそもformオブジェクトが不要になり、上記にてご相談していたコードをすべてやり直すことになりました。 したがって、エラー自体は解決できていないのですが、こちらの質問は閉じさせていただきます。 winterboum様には何度もご対応いただいたのに半端なことになってしまい、申し訳ございません。 ご対応いただき、本当にありがとうございました。 また詰まってしまった際は、ご助力いただけますと幸いです。 申し訳ございませんでした。
winterboum

2021/12/19 10:54

解決何より 別のエラー がなんで出たのか、は研究しておくほうがよいですよ
Mo.mi

2021/12/20 02:42

はい。 いますぐには知識が及ばず解決は難しそうですが、もっと学んだ後再挑戦して、どこを誤っていたのか分かるようになれればと思います。 重ね重ね、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問