実現したいこと
railsアプリで管理者領域とユーザー領域を分けようと思い、管理領域をkanri_page以下にネストしました。
ネストした上で記事(News)を作成するformを作成したところ、submitボタンを押した際に再度同じformが表示され、記事が作成・更新されません。
前提として
kanri_pageは領域として分けたい(URLをkanri_page以下にしたい)だけであってkanri_pageというmodelやdbは作成しないので、そういう場合はnamespaceではなく別の手段を使った方がいいという場合にはご指摘ください。
scopeの方がいいのかなとも思いましたが、できればviewもkanri_page以下にまとめたいと思いnamespaceを使用しました。
コードの状態
routes
namespace :kanri_page do resources :news end
controller(controllers/kanri_page/news_controller.rb)
class KanriPage::NewsController < ApplicationController before_action :set_news, only: %i[ show edit update destroy ] def index @search = News.ransack(params[:q]) @search.sorts = 'id desc' if @search.sorts.empty? @news = @search.result.page(params[:page]) end def show end def new @news = News.new end def edit end def create @news = News.new(news_params) respond_to do |format| if @news.save format.html { redirect_to kanri_page_news_path(@news), notice: "記事を登録しました。" } format.json { render :show, status: :created, location: @news } else format.html { render :new, status: :unprocessable_entity } format.json { render json: @news.errors, status: :unprocessable_entity } end end end def update respond_to do |format| if @news.update(update_news_params) format.html { redirect_to kanri_page_news_path(@news), notice: "記事を更新しました。" } format.json { render :show, status: :ok, location: @news } else format.html { render :edit, status: :unprocessable_entity } format.json { render json: @news.errors, status: :unprocessable_entity } end end end def destroy @news.destroy respond_to do |format| format.html { redirect_to kanri_page_news_index_path, notice: "記事を削除しました。" } format.json { head :no_content } end end private def set_news @news = News.find(params[:id]) end def news_params params.require(:news).permit(:title, :url, :publisher, :image, :writer, :posted_at, :article_type) end def update_news_params params.require(:news).permit(:title, :url, :publisher, :image, :writer, :posted_at, :article_type) end end
rails/info/routes
new.html.erb
・form_withをmodelで上手く扱えなかったためpathを指定
・edit.html.erbはpathをkanri_page_news_pathに
<div class="mx-auto md:w-2/3 w-full"> <h1 class="flex items-center justify-center font-bold text-4xl p-8">記事の登録</h1> <%= form_with(url: kanri_page_news_path, class: "contents") do |f| %> (省略) <div class="w-full flex items-center justify-center"> <%= f.submit "登録する", data: { disable_with: "送信中..." }, class: "btn text-white bg-green-600 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-4 py-2 dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800" %> </div> <% end %> <div class="w-full p-4 text-right"> <%= link_to '戻る', kanri_page_news_index_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> </div> </div>
状況
- formでsubmitするとnew、editページがリダイレクトされる
- エラー表示はない
- リダイレクトされるためmethodがGETになっていることを疑ったが、生成されるhtmlは
<form class="contents" enctype="multipart/form-data" action="/kanri_page/news" accept-charset="UTF-8" method="post">
となっているためPOSTで送信されているはず(editも同様)
4. コントローラーのcreateにbinding.pryを置くと止まるのでcreate自体には飛んでいるはず(updateも同様)
5. _news.json.jbuilderというファイルがあるがこれが何なのかわかっていない(model作成時に生成された?)
環境
rails7
tailwindcss
よろしくお願いいたします。
回答2件