🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

Q&A

解決済

2回答

2005閲覧

form_with editアクションにて複数のモデルから参照したい

osugi86

総合スコア3

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/02/06 23:19

編集2021/02/06 23:46

viewファイル

Ruby

1<%= form_with( model: [@main, @detail], url: page_path, local: true) do |f| %> 2 <%# render 'shared/error_messages', model: f.object %> 3 <%# 投稿画像 %> 4 <div class="img-upload"> 5 <div class="weight-bold-text"> 6 出品画像 7 <span class="indispensable">必須</span> 8 </div> 9 <div class="click-upload"> 10 クリックしてファイルをアップロード 11 </div> 12 <%= f.file_field :image %> 13 </div> 14 <%# 場所と場所の詳細 %> 15 <div class="weight-bold-text"> 16 場所 17 <span class="indispensable">必須</span> 18 </div> 19 20 <%= f.text_area :name, class:"single-input-primary", placeholder:"場所の名前(必須 20文字まで)", maxlength:"20" %> 21 22 <div class="weight-bold-text"> 23 <div class="info-text"> 24 場所の詳細 25 <span class="indispensable">必須</span> 26 </div> 27 </div> 28 29 <%= f.text_area :info, class:"single-input-primary", placeholder:"どんな場面なのか詳細を書いてみよう。(200文字まで)" ,rows:"7" ,maxlength:"200" %> 30 31 <div class="category_country"> 32 <%= f.collection_select(:category_id, Category.all, :id, :name, {}, {}) %> 33 <%= f.collection_select(:country_id, Country.all, :id, :name, {}, {}) %> 34 </div>

controller

Ruby

1class PagesController < ApplicationController 2 3 before_action :authenticate_user!, except: [:index, :show] 4 before_action :main_detail_find, only: [:show, :edit, :update, :destroy] 5 6 def index 7 @pages = Main.includes(:user).order("id DESC") 8 end 9 10 def show 11 end 12 13 def edit 14 end 15 16 def update 17 end 18 19 def destroy 20 if current_user.id == @main.user_id 21 @main.destroy 22 redirect_to root_path 23 else 24 redirect_to root_path 25 end 26 end 27 28 private 29 30 def main_detail_find 31 @main = Main.find(params[:id]) 32 @detail = Detail.find(@main.id) 33 end 34 35end

main

Ruby

1class CreateMains < ActiveRecord::Migration[6.0] 2 def change 3 create_table :mains do |t| 4 t.string :name, null: false 5 t.text :info, null: false 6 7 t.references :user, null: false, foreign_key: true 8 end 9 end 10end

detail

Ruby

1class CreateDetails < ActiveRecord::Migration[6.0] 2 def change 3 create_table :details do |t| 4 5 t.integer :category_id, null: false 6 t.integer :country_id, null: false 7 8 t.references :main, null: false, foreign_key: true 9 end 10 end 11end 12

イメージ説明
上の画像のように@detailの情報しか反映されません。
@mainからも反映されるようにしたいです。
何かいい方法ないでしょうか?
--------追記----------
Activestorageを使用しているのですが保存されている画像についても反映されません

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

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

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

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

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

guest

回答2

0

ベストアンサー

「上の画像のように@detailの情報しか反映されません。」と言われても、どのじょうほうがmainでなにがdetailか我々にはわかりません。

で、
form_with( model: [@main, @detail], url: page_path, local: true) do |f| %書くと、f は @detailと結びつきます。@mainは単にURL生成に使われるだけです。
そのURLはurl: optionで上書きされるので、結果このviewでは@mainは何の仕事もしていません。
text_field_tag を使って @mainの値を管理するか
form_with model: @main とし、@detailの方は fields_for を使って記述するかしてください

追記
suginokitech86 さんのこの設計はとても違和感があります。
PagesController は モデル Page を扱うという命名です。 Railsの規約では。
なのに モデル Main を扱っています。だから view での form_with でややこしい設定が必要になります。
敢えてモデルとは違うcontrollerを使うということもありますが、この場合その意味がありますか?

form_withでも model: [@main, @detail] と階層化する意味があるのか?
この記述は @detailを触るときの設定です。@mainも必要なら model: @main とし、@detail は field_forでやるのが Railsの普通だろうと思います。

PagesController をやめて MainsController にし、form_with model: @main にするというRailsの普通に合わせるともっと楽につくれると思います。作り直しを薦めます。

2021/02/07 08:39

投稿2021/02/06 23:32

編集2021/02/07 04:27
winterboum

総合スコア23567

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

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

osugi86

2021/02/06 23:39

winterboumさんありがとうごいます。 @mainと@detailについてはdbごと載せます
osugi86

2021/02/07 17:35

winterboumさん再度ご指摘の方ありがとうございます。 Pagescontrollerと命名した理由としましては投稿したデータ一覧を表示させるために作成いたしました。 Mainscontrollerは既にメイン画面にて使用してしまっていました。 見直しながら編集をしていきたいとおもっております。
winterboum

2021/02/07 23:34

Mainを一覧なら MainsController の index ですね。 config/routes.rb で resources :mans ってすると自動で6つurlが用意されますが、それは特別な理由がなければ利用したほうが良いです。
osugi86

2021/02/08 01:01

返信ありがとうございます。 今現状はMain/indexがメイン画面、Page/indexが投稿一覧表示となっております。 resourcesを使わない理由はPageではnew、createのルーティングを使用しないためでした。
winterboum

2021/02/08 03:35

ですから、 Main/showをメイン画面にしてほしい。 Mainならnew,createを使うでしょう。Main#indexは一覧。 indexってそういう意味でしょう。
guest

0

仕様として「メソッドの最後に記述した式が戻り値になる」というのがあるからでは。複数にしたいならその複数をまとめたオブジェクト・配列にするしかないと思います。

投稿2021/02/06 23:26

m.ts10806

総合スコア80875

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

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

osugi86

2021/02/06 23:35

m.ts10806さんいつもありがとうございます。 いちよう@main2=@main+@detailというように@main2を使用してform_withのmodel指定にしようかなと思ったのですがcontroller側の記述方法が思いつきません @main = Main.find(params[:id]) @detail = Detail.find(@main.id)この記述を変えようと思っています。
m.ts10806

2021/02/06 23:48

いつも?何かしましたっけ。。 質問1つも解決されてない方なので、むしろ批判的な気持ちしか私にはないですが。 あと細かいですが「とりあえずは」という意味で使いたいのでしたら「いちおう」です。「一応」 >@main2=@main+@detail これで想定の形になりますか?デバッグしてみてください。 てっきり [@main,@detail] とか {main:@name,detail:@detail} のように明確にわけるものと思っていました。
osugi86

2021/02/07 17:41

m.ts10806さん回答ありがとうございます。 いつもという意味に関してですが自分が質問したときに質問方法をご指摘いただいていたのでそう言った表現にしました。 あとはteratailsという場所については質問を必ず回答しなければいけないのでしょうか? 批判の意味をお願いいたします。
m.ts10806

2021/02/07 20:47

teratailsではなくteratailです。 >質問を必ず回答しなければいけないのでしょうか? いえ。そういう意味ではなく、質問履歴を見たら https://teratail.com/users/suginokitech86#question 1つも解決されてなかったので(私が見た時点。この質問だけ解決されている) 「指摘や回答がついている状態で投げっぱなしにしている」という意味で「解決する気ないんだなこの人」という批判です。 解決する気なしと判断されれば、アドバイスしたとしても無駄になると感じて、関わらないようにする回答者は少なくないです。 プログラミングの本質は問題解決。問題を放置したままの人に、成長が見込めないのは回答者側はよく知っているので、「未解決質問があるまま次々と質問を投稿する人」には批判的な感情しかありません。
osugi86

2021/02/08 00:56

返信ありがとうございます。 質問したことに関して自力で解決したら解決済などといったものがあるのでしょうか? あるとするならそれをしたいです。
osugi86

2021/02/08 01:06

返信ありがとうございます。 ベストアンサーにて解決済みなのですね。 ちなみに質問内容の削除などはできるのですか?
m.ts10806

2021/02/08 01:11

ヘルプ読んでください。
osugi86

2021/02/08 01:17

見てみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問