前提・実現したいこと
ポートフォリオとしてスポットの共有アプリを作成しています。
機能の1つとして投稿機能を実装しており、フォームに入力、データの保存はできているようなのですが、ビューにて住所(address)が表示されないため、質問させていただきました。
Postを親モデル、Mapを子モデルとしているため、関連付けが曖昧になっているのではないかと思い、何度も確認したのですが解決に至りませんでした。
お力添えをいただければと思います。よろしくお願いします。
発生している問題・エラーメッセージ
下記のエラーがでており、表示されません。
Postを親モデル、Mapを子モデルとして作成しています。
該当のソースコード
html
1posts/index.html.erb 2 3<%= render 'posts/new' %> 4. 5. 6. 7<span><%= post.maps.address %></span>
ruby
1posts/_new.html.rb 2 3 <%= form_with model: @post, class: "upload-images p-0 border-0" do |f| %> 4 <div class="form-group"> 5 <label>住所</label> 6 <div> 7 <%= f.fields_for :maps, @post.maps.build do |m| %> 8 <%= m.text_field :address, class: "form-control", placeholder: "住所" %> 9 <% end %> 10 </div> 11 <div class="form-group mb-3"> 12 <div class="col-auto pr-0"></div> 13 <label>テキスト</label> 14 <div> 15 <%= f.text_field :caption, class: "form-control", placeholder: "コメントを入力する" %> 16 </div> 17 </div> 18 <div class="mb-3"> 19 <%= f.fields_for :photos do |i| %> 20 <%= i.file_field :image %> 21 <% end %> 22 </div> 23 <%= f.submit "投稿する", class: "btn btn-primary" %> 24 <% end %>
ruby
1models/post.rb 2 3class Post < ApplicationRecord 4 belongs_to :user 5 has_many :maps, dependent: :destroy 6 has_many :photos, dependent: :destroy 7 accepts_nested_attributes_for :photos 8 accepts_nested_attributes_for :maps 9end
ruby
1models/map.rb 2 3class Map < ApplicationRecord 4 belongs_to :post 5 6 geocoded_by :address 7 after_validation :geocode, if: :address_changed? 8end 9
ruby
1controllers/posts.controller.rb 2 3class PostsController < ApplicationController 4 before_action :authenticate_user! 5 6 def new 7 end 8 9 def create 10 @post = Post.new(post_params) 11 redirect_to root_path 12 if @post.save 13 flash[:notice] = "投稿が保存されました" 14 else 15 flash[:alert] = "投稿に失敗しました" 16 end 17 end 18 19 def index 20 @post = Post.new 21 @post.photos.build 22 @post.maps.build 23 @posts = Post.limit(10).includes(:maps, :photos, :user).order('created_at DESC') 24 end 25 26 def show 27 @post = Post.find_by(id: params[:id]) 28 end 29 30 def destroy 31 @post = Post.find_by(id: params[:id]) 32 if @post.user == current_user 33 flash[:notice] = "投稿が削除されました" if @post.destroy 34 else 35 flash[:alert] = "投稿の削除に失敗しました" 36 end 37 redirect_to root_path 38 end 39 40 private 41 42 def post_params 43 params.require(:post).permit(:caption, maps_attributes: [:address, :latitude, :longitude], photos_attributes: [:image]).merge(user_id: current_user.id) 44 end 45 46 def set_post 47 @post = Post.find_by(id: params[:id]) 48 end 49end
ruby
1routes.rb 2 3Rails.application.routes.draw do 4 devise_for :users, 5 controllers: { registrations: 'registrations' } 6 root 'posts#index' 7 resources :users 8 resources :posts, only: %i[index new create show destroy] do 9 resources :photos, only: %i[create] 10 resources :maps, only: %i[create] 11 end 12end 13
ruby
1db/migrate 2 3class CreateMaps < ActiveRecord::Migration[6.1] 4 def change 5 create_table :maps do |t| 6 t.string :address 7 t.float :latitude 8 t.float :longitude 9 10 t.timestamps 11 end 12 end 13end 14 15class AddColumnToMap < ActiveRecord::Migration[6.1] 16 def change 17 add_reference :maps, :post, null: false, foreign_key: true 18 end 19end 20 21class CreatePosts < ActiveRecord::Migration[6.1] 22 def change 23 create_table :posts do |t| 24 t.string :caption 25 t.references :user, foreign_key: true, null: false 26 27 t.timestamps 28 end 29 end 30end 31
補足情報(FW/ツールのバージョンなど)
Rails 6.1.4.1
Mac OS
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/27 18:05 編集
2021/10/28 01:16
2021/10/28 01:29