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

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

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

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

Q&A

解決済

1回答

1756閲覧

一覧画面に新規投稿、編集、削除機能をつけようとしているが、編集ではなく新規投稿になってしまう

harukome

総合スコア26

Ruby on Rails 6

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

0グッド

0クリップ

投稿2022/04/06 06:07

前提

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])ができていないのかなと考えたのですが、改善方法がわかりませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

link_to "編集する", characters_path(t.id)
ここですね。
link_to "編集する", character_path(t.id)

Rails では単数形複数形に 敏感になってください

投稿2022/04/06 06:40

winterboum

総合スコア23347

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

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

harukome

2022/04/06 06:49

ご回答ありがとうございます。 変更してみたのですが、次は以下のようなエラーが出ました。 ルーティングを修正する必要があるのでしょうか。 AbstractController::ActionNotFound (The action 'show' could not be found for CharactersController Did you mean? destroy create_from_edit update create_from_new):
winterboum

2022/04/06 07:36

ごめん間違えた edit_character_path ですね。 rails routes で確認できます
harukome

2022/04/06 07:57

ありがとうございます。 edit_character_path(t.id)と変更するとeditアクションがないというエラーが出たので、ルーティングを以下のように変更しました。(スマートなやり方ではないのかもしれないですが、、。) resources :characters, except: [:show, :new, :edit] do member do get :edit, controller: 'characters', action: 'index' end end こうすると無事解決できました! まだ頭のなかがこんがらがっているので少し整理してみたいと思います。 今回も助言いただいて有難うございました!
winterboum

2022/04/06 08:29

それあまり良くないと思います。 viewにいろいろな機能を持たせるのはありですが、action はシンプルな方がよいです。 action edit をつくり、その結果の表示を render :index するのがよいです。
harukome

2022/04/06 11:21 編集

そうなんですね。少し調べてやってみました。 #characters_controller def index @characters = Character.where(user_id: current_user.id) @character = Character.new end def edit @characters = Character.where(user_id: current_user.id) @character = Character.find(params[:id]) render :index end ー--------------------------------------------- #routes.rb resources :characters, except: [:show, :new, :edit] do member do get :edit, controller: 'characters', action: 'edit' end このように書き換えたところ、今のところ正常に作動しています。 winterboumさんが教えてくださった方法はこれであっていますでしょうか??
harukome

2022/04/06 13:21

ありがとうございます!助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問