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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

994閲覧

モデルとモデルの関連付けについて

nakajima1

総合スコア5

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/01/08 14:26

前提・実現したいこと

rails初心者です。
投稿formでformwithとfields_forを使い、messageモデルとshopモデルを入れてdbを分けている状況です。
そこでユーザーが投稿した内容をmessageモデル、shopモデル揃えてshowページに1件づつ取得し、表示させるような実装を考えております。messageは1件づつ表示させているのですが、そこにshopモデルの内容をどうやって紐づけるのかわかりませんでした。

発生している問題・エラーメッセージ

NoMethodError in MessagesController#new


マイグレーション

lang

1class CreateShops < ActiveRecord::Migration[5.2] 2 def change 3 create_table :shops do |t| 4 t.string "name" 5 t.string "prefecture" 6 t.string "address_city" 7 t.string "address_street" 8 t.string "address" 9 t.float "latitude" 10 t.float "longitude" 11 t.references :user, foreign_key: true 12 t.timestamps 13 end 14 end 15end

マイグレーション

lang

1class CreateMessages < ActiveRecord::Migration[5.2] 2 def change 3 create_table :messages do |t| 4 t.string :name 5 t.text :text 6 t.string :image 7 t.timestamps null: true 8 end 9 end 10end

message.rb

lang

1class Message < ApplicationRecord 2 mount_uploader :image, ImageUploader 3 belongs_to :user, optional: true 4 belongs_to :shop, optional: true 5 6 accepts_nested_attributes_for :shop 7 has_many :likes, dependent: :destroy 8 9 def like_user(user_id) 10 likes.find_by(user_id: user_id) 11 end 12 13end 14

user.rb

lang

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 has_many :messages 7end

shop.rb

lang

1class Shop < ApplicationRecord 2 geocoded_by :address 3 after_validation :geocode, if: :address_changed? 4 has_many :messages 5 belongs_to :user, optional: true 6 geocoded_by :address 7 after_validation :geocode 8end

message.controller

lang

1class MessagesController < ApplicationController 2 3 before_action :move_to_index, except: :index 4 5 def index 6 @messages = Message.order("created_at DESC").page(params[:page]).per(6) 7 8 respond_to do |format| 9 format.html 10 format.js 11 end 12 end 13 14 def new 15 @messages = Message.new 16 @messages = @messages.shop.build 17 end 18 19 def create 20 @messages = Message.new(messages_params) 21 @messages.save 22 end 23 24 25 def show 26 @nickname = current_user.nickname 27 @messages = Message.find(params[:id]) 28 end 29 30 31 def destroy 32 message = messages.find(params[:id]) 33 message.destroy if message.user_id == current_user.id 34 end 35 36 def edit 37 @messages = Message.find(params[:id]) 38 end 39 40 def update 41 message = Message.find(params[:id]) 42 if message.user_id == current_user.id 43 message.update(messages_params) 44 end 45 end 46 47 private 48 49 def messages_params 50 params.require(:message).permit(:text, :image, shop_attributes:[:name, :address, :latitude, :longitude, :message_id ]) 51 end 52 53 54 def move_to_index 55 redirect_to action: :index unless user_signed_in? 56 end 57 58end 59

試したこと

shopモデルのマイグレーションファイルにmessage_idを追加し、ストロングパラメータにもmessage_idを追加しましたが、dbに反映されなかったです。
外部キーreferences型で試してみましたが、user_idは反映されましたが。message_idは反映されなかったです。
完全に見当違いかもしれませんが、アドバイスよろしくお願いします。。。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージは1行だけではなく、全体を出してください。他の行にもじゅうような情報が載っています。今回はたまたま2行しか無いのでわかりましたが。

NoMethodError in MessagesController#new
このエラーそのものは
def new @messages = Message.new @messages = @messages.shop.build end
がおかしいからです。これですとmessegeを作るたびにShopを新設することになります。あるshopへのmessageを作るのでしょうから
@shop = Shop.find(ここ) @message = @shop.messages.build
です。「ここ」の部分はこの new を呼ぶviewからshopのidを送って来るようにしてその値を入れます。

投稿2020/01/08 21:35

winterboum

総合スコア23331

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

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

nakajima1

2020/01/09 13:26

回答ありがとうございます。 viewからshop.idを送るというのはfoem.collection_selectを使用して送るのでしょうか??
nakajima1

2020/01/09 14:02

失礼しました、foem.collection_selectはセレクトメニューの作成する時なんですね、 もう少し調べてみます。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問