実現したいこと
次のような関連付けを行ったデータの更新(update)を1つのフォーム(memoの更新フォーム)で行いたいです。
その際、memoに関連付けられたsourceモデルのurlを入力フォームにオートフィルさせたいです。
現状でも更新自体はできますが、フォームのurl入力欄が空欄になってしまいます。
実行環境
・Rails 6.0.0
・ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
・Cloud 9
ソースコード
rb
1class MemosController < ApplicationController 2 3#(中略) 4 5 def new 6 @memo = Memo.new 7 @source = @memo.sources.build 8 end 9 10 def create 11 @memo = Memo.new(memo_params.slice(:word, :content, :synonym, :tag_list)) 12 byebug 13 if @memo.save 14 memo_params[:url].reject(&:blank?).uniq.each do |url| 15 @source = Source.find_or_create_by(url: url) 16 @memo.sources << @source 17 end 18 flash[:notice] = "新しいMemoを作成しました!" 19 redirect_to root_url 20 else 21 flash.now[:alert] = "無効な送信です" 22 render :new 23 end 24 end 25 26#(中略) 27 28 #editとupdateを上手く実装できません 29 def edit 30 @memo = Memo.find(params[:id]) 31 end 32 33 def update 34 @memo = Memo.find(params[:id]) 35 if @memo.update(memo_params) 36 redirect_to root_url 37 flash[:notice] = "Memoを更新しました!" 38 else 39 flash.now[:alert] = "無効な送信です" 40 render :edit 41 end 42 end 43 44 private 45 def memo_params 46 params.require(:memo).permit(:word, :content, :synonym, :tag_list, url: []) 47 end 48end
erb
1<%= form_with model: @memo, local: true do |f| %> 2 <div class="form-group"> 3 <%= f.label :word, "単語" %> 4 <%= f.text_field :word, class: "form-control", %> 5 </div> 6 <div class="form-group"> 7 <%= f.label :synonym, "別名" %> 8 <%= f.text_field :synonym, class: "form-control" %> 9 </div> 10 <div class="field form-group"> 11 <%= f.label :tag_list, "単語" %> 12 <%= text_field_tag 'memo[tag_list]', @memo.tag_list.join(","), class: "form-control" %> 13 </div> 14 <div class="form-group"> 15 <%= f.label :content, "意味" %> 16 <%= f.text_area :content, rows: "10", class: "form-control" %> 17 </div> 18 <div class="form-group"> <!--この部分にmemoと関連付けたurlをオートフィルさせたい--> 19 <%= f.label :url, "単語" %> 20 <%= f.url_field :url, name: "memo[url][]", class: "form-control" %> 21 <%= f.url_field :url, name: "memo[url][]", class: "form-control url-form" %> 22 <%= f.url_field :url, name: "memo[url][]", class: "form-control url-form" %> 23 </div> 24 <div class="form-group"> 25 <%= f.submit yield(:btn_message), class: "btn btn-success btn-lg btn-block" %> 26 </div> 27<% end %>
困っていること
上記内容でeditしようとすると、urlの入力欄に値がオートフィルされません。
原因はeditアクションのインスタンス変数@memoにキーがurlの値が入っていないことだと考えております。
なんとか更新フォームのurl入力欄に@memoと関連付けられたurlをオートフィルさせることは出来ないでしょうか。
試したこと
更新時にオートフィルされるのはeditアクションで作成された@memoに入っているハッシュを元に行われている?と考え、@memoに関連付けたurlを代入しようとしましたが、うまいくいきませんでした。
・関連付けから習得したurlの配列を@sourceに代入し、:urlをキーとして@memoに追加しようとするもエラー
MemoController
1def edit 2 @memo = Memo.find(params[:id]) 3 @source = @memo.sources 4 @memo[:url] = @source 5end
error
1ActiveModel::MissingAttributeError in MemosController#edit 2can't write unknown attribute `url`
・配列として代入したいのだから、挿入先に空の配列を用意してみるもエラー
MemoController
1def edit 2 @memo = Memo.find(params[:id]) 3 @source = @memo.sources 4 @memo[:url][] = @source 5end
error
1NoMethodError in MemosController#edit 2undefined method `[]=' for nil:NilClass
どなたか、ヒントだけでもいいので、ご回答お願い申し上げます。
回答1件
あなたの回答
tips
プレビュー