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

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

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

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

Q&A

解決済

2回答

545閲覧

rails ネストしたform_withでcreate、updateができない

takamaru_ss

総合スコア6

Ruby on Rails

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

0グッド

0クリップ

投稿2023/01/11 08:53

実現したいこと

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>

状況

  1. formでsubmitするとnew、editページがリダイレクトされる
  2. エラー表示はない
  3. リダイレクトされるため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

よろしくお願いいたします。

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

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

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

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

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

no1knows

2023/01/11 11:43

> 管理者領域とユーザー領域を分けよう この領域という言葉がよくわかっていないのですが、まとめると、 例えばnewページであれば 管理者用URL:/kanri_pages/news/new.html ユーザー用URL:/news/new.html この2つのページを同じ振る舞いにしたいという認識で良いのでしょうか?
takamaru_ss

2023/01/11 12:51

ユーザーは投稿は行わない予定です 管理者が投稿や編集を行うページをkanri_page以下に統一してユーザーの使うページと分けたいです viewの置き場所がユーザーページと一緒になってしまいますが一度scopeを用いて試してみます
guest

回答2

0

自己解決

すみません、scopeを使うことで解決できました
お手数をおかけしました

コントローラーやviewの場所は望んだ形にはなりませんが、パス(URL)はkanri_page以下に収めた状態で登録・更新ができるようになりました

routes
scope :kanri_page do
resources :news
end

コントローラー:assets/controllers直下
view:app/views/newsフォルダ下にindex,new,edit等

投稿2023/01/11 13:39

takamaru_ss

総合スコア6

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

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

0

質問文からどこがネスト部分か分からなかったですが
formはネストできないんじゃないでしょうか

投稿2023/01/11 09:15

yuma.inaura

総合スコア1453

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

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

takamaru_ss

2023/01/11 10:27

ご回答いただきありがとうございます。 ネストしているモデルに対するform_withの書き方 https://qiita.com/j-sunaga/items/29c5ff295798bc7884c7 という記事があったので試してみたのですがresourcesを用いた場合は可能でnamespaceだとできないということでしょうか。
yuma.inaura

2023/01/11 10:28

質問タイトルを読んでformがネストしてるのかと思いましたがモデルってことですか
takamaru_ss

2023/01/11 12:49

パス(URL)をkanri_page以下に収める形にしたいです これによってコントローラーとviewの場所もkanri_pageフォルダ下となります モデルは通常通りですね 同じパス(kanri_page以下に収める)の形になるscopeで試してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問