前提・実現したいこと
ここに質問の内容を詳しく書いてください。
初めまして!プログラミング初心者です。
RailsでFormオブジェクトを使用した場合の、複数テーブルの編集・更新機能の実装方法についてご教授願いたいです。
Formオブジェクトを使い一つのフォームから二つのテーブルにデータを保存しました。
データを保存することはできましたが、編集することができません。
編集ページへの遷移には成功し、更新ボタンを押すとRouting Errorが出てしまいます。
発生している問題・エラーメッセージ
Routing Error No route matches [PATCH] "/tweets"
該当のソースコード
model
Ruby
1class Tweet < ApplicationRecord 2 belongs_to :user 3 has_one_attached :image 4 has_one :tweet_link 5 6 extend ActiveHash::Associations::ActiveRecordExtensions 7 belongs_to :category 8end 9 10 11class TweetLink < ApplicationRecord 12 belongs_to :tweet 13end 14 15 16 17
routes
Ruby
1Rails.application.routes.draw do 2 devise_for :users 3 root to: "tweets#index" 4 resources :tweets, only: [:new, :create, :show, :edit, :update] 5end
tweets controller
Ruby
1class TweetsController < ApplicationController 2 before_action :authenticate_user!, only: :new 3 before_action :set_tweet, only: [:show, :edit, :update] 4 5 def index 6 @tweets = Tweet.includes(:user).order('created_at DESC') 7 end 8 9 def new 10 @tweet_form = TweetForm.new 11 end 12 13 def create 14 @tweet_form = TweetForm.new(tweet_params) 15 if @tweet_form.valid? 16 @tweet_form.save 17 redirect_to root_path 18 else 19 render :new 20 end 21 end 22 23 def show 24 end 25 26 def edit 27 @tweet_form = @tweet 28 end 29 30 def update 31 @tweet_form = @tweet 32 @tweet_form = TweetForm.new(tweet_params) 33 if @tweet.valid? 34 @tweet.update 35 redirect_to root_path 36 else 37 render :edit 38 end 39 end 40 41 private 42 43 def set_tweet 44 @tweet = Tweet.find(params[:id]) 45 end 46 47 def tweet_params 48 params.require(:tweet_form).permit(:image, :title, :info, :category_id, :link_one, :link_two, :link_three, 49 :link_four).merge(user_id: current_user.id) 50 end 51end
Formオブジェクト
Ruby
1class TweetForm 2 include ActiveModel::Model 3 attr_accessor :image, :title, :info, :category_id, :user_id, :link_one, :link_two, :link_three, :link_four 4 5 with_options presence: true do 6 validates :image 7 validates :title 8 validates :info 9 validates :category_id, numericality: { other_than: 1 } 10 validates :user_id 11 end 12 13 def save 14 tweet = Tweet.create(image: image, title: title, info: info, category_id: category_id, user_id: user_id) 15 TweetLink.create(link_one: link_one, link_two: link_two, link_three: link_three, link_four: link_four, tweet_id: tweet.id) 16 end 17 18 def update 19 tweet = Tweet.update(image: image, title: title, info: info, category_id: category_id, user_id: user_id) 20 TweetLink.update(link_one: link_one, link_two: link_two, link_three: link_three, link_four: link_four, tweet_id: tweet.id) 21 end 22end
試したこと
tweetのidが指定されていないため、エラーになっていると思い、updateアクションにもcreateと同じような記述をした。
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
Ruby on Rails 6.0.0
あなたの回答
tips
プレビュー