前提・実現したいこと
Ruby on Railsで用語を投稿するアプリを作っています。
初心者の為、拙い文章で分かりづらく申し訳ありません。
FormObjectを使った「用語」(termsテーブル)に対する、タグ付け機能を実装中にupdate更新で以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
Gyazoエラー画面
ArgumentError in TermsController#update
wrong number of arguments (given 4, expected 1)
解決したい事
- 複数テーブルを同時に保存する為、FormObjectを活用し、
投稿した用語に対してタグ付け機能を付けたいです。
show.html.erb(投稿編集画面)で編集ボタンを押すと、画像のエラーとなります。
ArgumentError in TermsController#update
wrong number of arguments (given 4, expected 1)
2. 前述の内容に関係すると思いますが、show画面からedit画面へtag(タグ)情報だけ送られていません。
編集画面に遷移したら、tagのフォームは空の状態となっています。編集画面にもtag情報を反映したいです。
※フォーム入力時tagの候補を出す為、javascriptで非同期通信のインクリメンタルサーチを使っています。searchアクション内では、その定義を行っていおります。
- リスト既に試してみた記述
いくつか試しましたが、createアクションとupdateアクションが上手く機能しません。
投稿と編集を正常に実行したいです。
■createアクションで投稿は出来るが、updateアクションでエラー
param is missing or the value is empty
■投稿、編集どちらでも、新規投稿が実行されてしまう
該当のソースコード
terms_controller.rb
Ruby
1class TermsController < ApplicationController 2 before_action :genre_set 3 before_action :move_to_new, except: [:index, :create, :show, :search, :research] 4 before_action :set_term , only: [:show, :destroy, :edit] 5 6 def index 7 @terms = Term.all.order("created_at DESC") 8 end 9 10 def new 11 @term = TermsTag.new 12 end 13 14 def create 15 @term = TermsTag.new(new_params) 16 if @term.valid? 17 @term.save 18 redirect_to root_path 19 else 20 render :new 21 end 22 end 23 24 def show 25 @terms = Term.find(params[:id]) 26 end 27 28 def edit 29 end 30 31 def update 32 @term = Term.find(params[:id]) 33 @tag = @term.tags 34 if @term.update(params[:title,:reference,:text,:genre_id]) 35 @tag.update(params[:name]) 36 redirect_to root_path 37 else 38 redirect_to action: :edit 39 end 40 end 41 42 def destroy 43 if @term.destroy 44 redirect_to terms_path 45 else 46 redirect_to action: :show 47 end 48 end 49 50 def genre 51 @terms = Term.genre(params[:id]) 52 end 53 54 def search 55 return nil if params[:input] == "" 56 tag = Tag.where(['name LIKE ?', "%#{params[:input]}%"] ) 57 render json:{ keyword: tag } 58 end 59 60 def research 61 @terms = Term.research(params[:keyword]) 62 end 63 64 private 65 66 def move_to_new 67 redirect_to new_user_session_path unless user_signed_in? 68 end 69 70 def term_params 71 params.require(:term).permit(:name,:title,:reference,:text,:genre_id).merge(user_id: current_user.id) 72 end 73 74 def new_params 75 params.require(:terms_tag).permit(:name,:title,:reference,:text,:genre_id).merge(user_id: current_user.id) 76 end 77 78 def set_term 79 @term = Term.find(params[:id]) 80 end 81 82 def genre_set 83 @genres = Genre.all.where.not(id: 1) 84 end 85 86end
Forms terms_tag.rb(フォームオブジェクト)
Ruby
1class TermsTag 2 3 include ActiveModel::Model 4 attr_accessor :user_id, :name, :token, :genre_id, :term_id, :tag_id, :title, :text, :reference 5 6 with_options presence: true do 7 validates :name 8 validates :title 9 validates :text 10 validates :reference 11 end 12 13 validates :genre_id, numericality: { other_than: 1 } 14 15 def save 16 term = Term.new(title: title, text: text, reference: reference, genre_id: genre_id, user_id: user_id) 17 term.save 18 tag = Tag.where(name: name).first_or_initialize 19 tag.save 20 21 TermTagRelation.create(term_id: term.id, tag_id: tag.id) 22 end 23 24end
tag.rb(タグモデル)
Ruby
1class Tag < ApplicationRecord 2 3 has_many :term_tag_relations, dependent: :destroy 4 has_many :terms, through: :term_tag_relations 5 6 validates :name, uniqueness: true 7end 8
term.rb(用語モデル)
Ruby
1class Term < ApplicationRecord 2 extend ActiveHash::Associations::ActiveRecordExtensions 3 belongs_to_active_hash :genre 4 belongs_to :user 5 has_many :term_tag_relations, dependent: :destroy 6 has_many :tags, through: :term_tag_relations 7 8 9 10 def self.genre(genre) 11 if 1 < genre.to_i && genre.to_i < 13 12 Term.where('genre_id LIKE(?)', "%#{genre}%") 13 else 14 Term.all 15 end 16 end 17 18 def self.research(research) 19 if research != "" 20 Term.where('title LIKE(?)', "%#{research}%") 21 Term.where('reference LIKE(?)', "%#{research}%") 22 else 23 Term.all 24 end 25 end 26end
show.html.erb(views)用語詳細画面
Ruby
1<div class="term-show"> 2 <div class="term-box"> 3 <h2 class="name"> 4 <%= @term.title %> 5 </h2> 6 7 <table class="detail-table"> 8 <tbody> 9 <tr> 10 <th class="detail-term">投稿者ニックネーム</th> 11 <td class="detail-value"><%= @term.user.nickname %></td> 12 </tr> 13 <tr> 14 <th class="detail-term">ジャンル</th> 15 <td class="detail-value"><%= @term.genre.name %></td> 16 </tr> 17 <tr> 18 <th class="detail-term">用語キーワード</th> 19 <td class="detail-value"><%= @term.title %></td> 20 </tr> 21 <tr> 22 <th class="detail-term">引用元詳細</th> 23 <td class="detail-value"><%= @term.reference %></td> 24 </tr> 25 <tr> 26 <th class="detail-term">タグ</th> 27 <td class="detail-value"> 28 <%@terms.tags.each do |term| %> 29 #<%=term.name%> 30 <%end%> 31 </td> 32 </tr> 33 <tr> 34 <th class="detail-term">URL</th> 35 <td class="detail-value"><%= raw Rinku.auto_link(h(@term.text)) %></td> 36 </tr> 37 <tr> 38 <th class="detail-term">投稿日時</th> 39 <td class="detail-value"><%= @term.created_at.strftime('%Y/%m/%D %H:%M:%S') %></td> 40 </tr> 41 </tbody> 42 </table> 43 </div> 44</div> 45<div class="term-show-bottom"> 46 <div class="term-bottom"> 47 <% if user_signed_in? && current_user.id == @term.user_id %> 48 <%= link_to '用語の編集', edit_term_path(@term.id), method: :get, class: "btn-flat-border-edit" %> 49 <%= link_to '削除', term_path(@term.id), method: :delete, class:'btn-flat-border-destroy' %> 50 <% end %> 51 <div class="option"> 52 <div class="favorite-btn"> 53 <%= image_tag "sozai_cman_jp_20200928143103.png" ,class:"favorite-star-icon" ,width:"20",height:"20"%> 54 <span>いいね 0</span> 55 </div> 56 </div> 57 </div> 58</div> 59<div class="bottom-toppage"> 60<%= link_to 'トップページへ戻る', root_path, method: :get, class:'another-term' %> 61</div> 62<%= render "shared/footer" %> 63
edit.html.erb(views)用語編集画面
Ruby
1<%= render "shared/header", locals: {term: @term} %> 2 3<div class="boxcontent"> 4<%= form_with model: @term, url:term_path(@term.id), method: :patch, local: true, scope: :term do |f| %> 5<%= render 'shared/error_messages', model: f.object %> 6 <div class="term-post"> 7 <div class="term-post-box">編集する</div> 8 <%= f.text_field :title, class:"title", placeholder:"タイトル" %> 9 <%= f.text_field :reference, class:"title", placeholder:"引用元記述" %> 10 <%= f.text_area :text, class:"text", placeholder:"URLのみ記述" %> 11 <%= f.collection_select(:genre_id, Genre.all, :id, :name, {}, {class:"genre-select"}) %> 12 <div class="tag-field", id='tag-field'> 13 <%= f.label :name, "#タグ" %> 14 <%= f.text_field :name, class:"input-tag" %> 15 </div> 16 <div id="search-result"> 17 </div> 18 <div class="edit-btn-contents"> 19 <%= f.submit "編集する" ,class:"edit-btn" %> 20 <%=link_to 'もどる', term_path(@term.id), class:"back-btn" %> 21 </div> 22<% end %> 23</div> 24<%= render "shared/footer" %>
termsテーブル
Ruby
1class CreateTerms < ActiveRecord::Migration[6.0] 2 def change 3 create_table :terms do |t| 4 t.string :title , null: false 5 t.string :reference , null: false 6 t.text :text , null: false 7 t.integer :genre_id , null: false 8 t.references :user , null: false ,foreign_key: true 9 t.timestamps 10 end 11 end 12end
tagsテーブル
Ruby
1class CreateTags < ActiveRecord::Migration[6.0] 2 def change 3 create_table :tags do |t| 4 t.string :name, null:false, uniqueness: true 5 t.timestamps 6 end 7 end 8end
term_tag_relationsテーブル(中間テーブル)
Ruby
1class CreateTermTagRelations < ActiveRecord::Migration[6.0] 2 def change 3 create_table :term_tag_relations do |t| 4 t.references :term, foreign_key: true 5 t.references :tag, foreign_key: true 6 t.timestamps 7 end 8 end 9end 10
試したこと
先に記述させて頂きました内容と同様ですが、
・既に試してみた記述
1(createアクションで投稿は出来るが、updateアクションでエラー)param is missing or the value is empty
2(投稿、編集どちらでも、新規投稿が実行されてしまう)
3【現在】2つのモデルから情報を引っ張り、update更新を行おうとしておりますが、
方法が分からず、現在のエラーとなっております。
ArgumentError in TermsController#update
wrong number of arguments (given 4, expected 1)
分かりにくい内容で申し訳ありませんが、
ご回答の程、何卒、宜しくお願い致します。
補足情報(FW/ツールのバージョンなど)
Ruby on Rails 6
あなたの回答
tips
プレビュー