解決したいこと・現状
Rails にて掲示板を作成中です。
新規投稿機能(post)を実装後、編集機能を追加しようと思い、editアクションとupdateアクションをpostコントローラーに追加しました。
すると今まで新規投稿フォームから新規投稿できていた実装が、
全て上書きされてしまう状態になってしまいました。
(例:投稿内容「あいう」と投稿する→新規投稿フォームで「かきく」と入力し投稿すると「あいう」が「かきく」に上書きされてしまう)
エラー画面は出ておらず、ターミナル上ではupdateアクションが実行されたという記述になっています。
編集画面はedit.html.erbとして用意しています。
編集は問題なくできるのですが、新規投稿ができなくなってしまった状況です。
仮説
状況としては、createアクションが呼ばれずupdateアクションになってしまっているので
form_withの記述の誤りか、ルーティングがおかしいのかと仮説しています。
ルーティングがresourcesを使用しているので問題ないとは思っているのですが、
原因がわかりません。
コメントいただいた内容を元に、topics_controller.rbの@postを見返し、
@post = Post.find(params[:id])
があるからupdateされてしまうのではないかと考えコメントアウトしてみたら新規投稿はできるようになりましたが、
showページの「edit」へのリンクが消えてしまいました。
初学者で理解が浅い点があり、申し訳ありませんが
お助けいただけると嬉しいです。
よろしくお願いいたします。
コード
(show.html.erb)Topicはpostのタイトル要素です。
<div class="new-post"> <h2>New post</h2> <%= form_with(model: [@topic, @post], local: true) do |f| %> <p><%= f.text_area :body %></p> <%= f.submit "Post" %> <% end %> </div>
同ファイル(編集リンク箇所)
<div class="posts"> <% if @posts %> <% @posts.each do |post| %> <div class="post-content"> <div class="post-body"> <%=safe_join(post.body.split("\n"),tag(:br))%> </div> <div class="post-info"> <div class="post-user"> from:<%= link_to post.user.nickname, "/users/#{post.user_id}" %> </div> <div class="post-date"> date:<%= post.created_at %> </div> <div class="post-edit"> <% if current_user.id == @post.user_id %> <%= link_to "edit", edit_topic_post_path(post.id), method: :get %> <% end %> </div> </div> </div> <% end %> <% end %> </div>
(edit.html.erb)
<div class="post-edit-page"> <div class="post-edit-form"> <%= form_with(model: @post, url: topic_post_path, local: true) do |f| %> <%= f.text_area :body %> <%= f.submit "Edit" %> <% end %> </div> </div>
(posts_controller.rb)
class PostsController < ApplicationController def create @post = Post.create(post_params) redirect_to "/topics/#{@post.topic.id}" end def edit @post = Post.find(params[:id]) end def update post = Post.find(params[:id]) if post.update(post_params) redirect_to topic_path else render 'edit' end end private def post_params params.require(:post).permit(:body).merge(user_id: current_user.id, topic_id: params[:topic_id]) end end
(topics_controller.rb)
def show @topic = Topic.find(params[:id]) @post = Post.new @posts = @topic.posts.includes(:user) @post = Post.find(params[:id]) end
(routes.rb)
resources :topics, only: [:index, :new, :show, :create] do resources :posts, only: [:create, :edit, :update] end end
回答1件
あなたの回答
tips
プレビュー