前提・実現したいこと
お世話になります。
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
回答1件
あなたの回答
tips
プレビュー