前提
ruby on railsで過去の出来事について投稿するSNSのようなものを製作しています。
postテーブルとcharacterテーブルがcharacters_postテーブルを介して多対多の関係になっています。
説明不足な部分があるかもしれないので、不明点がありましたら質問して頂けますと幸いです。
実現したいこと
- character一覧画面で、新規characterの登録、編集、削除ができるようにしたいです。
- 名前の横の編集リンクを押してリダイレクトした場合に、新規登録の投稿フォームが編集用のフォームとして利用できるようにしたいです。
※こちらのサイトの例をイメージしています。Railsで更新も編集も削除も、全部indexページでやりたい
発生している問題・エラーメッセージ
編集リンクを押して元のページにリダイレクトされても、選択したcharacterの名前がformに表示されず、submitしても新規登録になってしまう。
編集リンクを押すと、コマンドプロンプトには以下のように表示されます。
Started GET "/characters.1" for ::1 at 2022-04-06 14:37:25 +0900 Processing by CharactersController#index as */* User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]] Rendering layout layouts/application.html.erb Rendering characters/index.html.erb within layouts/application Character Load (0.2ms) SELECT "characters".* FROM "characters" WHERE "characters"."user_id" = ? [["user_id", 1]] ↳ app/views/characters/index.html.erb:4 Rendered characters/index.html.erb within layouts/application (Duration: 5.3ms | Allocations: 2313) [Webpacker] Everything's up-to-date. Nothing to do Rendered layout layouts/application.html.erb (Duration: 60.6ms | Allocations: 6868) Completed 200 OK in 69ms (Views: 61.9ms | ActiveRecord: 0.6ms | Allocations: 8477)
該当のソースコード
1,charactersコントローラー
characters_controller.rb
1 def index 2 if params[:id].present? 3 @characters = Character.where(user_id: current_user.id) 4 @character = Character.find(params[:id]) 5 else 6 @characters = Character.where(user_id: current_user.id) 7 @character = Character.new 8 end 9 end 10 11 def update 12 chracter = Character.find(params[:id]) 13 if character.update(character_params) 14 redirect_back(fallback_location: root_path, notice: '編集できました') 15 else 16 redirect_back(fallback_location: root_path, notice: '編集できませんでした') 17 end 18 end 19 20 def create 21 character = Character.new(character_params) 22 character.user_id = current_user.id 23 if character.save 24 redirect_back(fallback_location: root_path, notice: '追加しました') 25 else 26 redirect_back(fallback_location: root_path, notice: '追加できませんでした') 27 end 28 end 29 30 def destroy 31 character = Character.find(params[:id]) 32 character.destroy 33 redirect_back(fallback_location: root_path, notice: '削除しました') 34 end 35 36 private 37 def character_params 38 params.require(:character).permit(:name) 39 end 40 end
2,viewページ
characters/index.html.erb
1<h3>登場人物一覧</h3> 2<div class="character"> 3 <p> 4 <% @characters.each do |t| %> 5 <p> 6 <%= t.id %> 7 <%= t.name %> 8 <%= link_to "編集する", characters_path(t.id) %> 9 <%= link_to "削除する", character_path(t.id), method: :delete %> 10 </p> 11 <% end %> 12 </p> 13 14 15 <p>登場人物を追加する</p> 16 <!-- urlを追加して送信先を明確に指定した --> 17 <%= form_for @character, url: characters_path do |f| %> 18 <div class="character_field"> 19 <%= f.label :'名前' %> 20 <%= f.text_field :name, :size => 140 %> 21 </div> 22 <%= f.submit "登録する" %> 23 <% end %> 24</div>
3,ルート
routes.rb
1 resources :characters do
試したこと
コマンドプロンプトを確認すると、user_idに関連するcharacterは取得できているが、選択したcharacterのデータは取得できていないように思えました。characters_path(t.id)でidがコントローラー側に渡せておらず、@character = Character.find(params[:id])ができていないのかなと考えたのですが、改善方法がわかりませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/04/06 06:49
2022/04/06 07:36
2022/04/06 07:57
2022/04/06 08:29
2022/04/06 11:21 編集
2022/04/06 12:18
2022/04/06 13:21