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

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

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

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

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

Ruby on Rails

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

2回答

480閲覧

Formオブジェクトを用いた編集機能でupdateができません

shunxile

総合スコア26

Ruby

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

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

Ruby on Rails

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2021/01/25 21:30

編集2021/01/26 02:43

前提・実現したいこと

メッセージを画像や動画と共に投稿するアプリケーションを開発してます。
新規投稿機能、詳細機能、編集機能、削除機能と一通り実装した後
タグ機能を追加実装した際にFormオブジェクトを用いて実装した後
編集機能でNoMethodErrorが発生するようになりました。
編集を完了させるにはどうすればよろしいでしょうか?
よろしくお願いします。

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

NoMethodError in MessagesController#update undefined method `update' for MessageTag:Class

該当のソースコード

messagescontroller

1class MessagesController < ApplicationController 2 before_action :authenticate_user!, except: [:index] 3 before_action :search_message, only: [:index, :search] 4 5 def index 6 @q = Message.ransack(params[:q]) 7 @messages = Message.includes(:user).order("created_at DESC") 8 end 9 10 def new 11 @message = MessageTag.new 12 end 13 14 def create 15 @message = MessageTag.new(message_params) 16 if @message.valid? 17 @message.save 18 return redirect_to root_path 19 else 20 render :new 21 end 22 end 23 24 def show 25 @message = Message.find(params[:id]) 26 end 27 28 def edit 29 @message = Message.find(params[:id]) 30 if current_user.id != @message.user.id 31 redirect_to root_path 32 end 33 end 34 35 def update 36 @message = Message.find(params[:id]) 37 @message = MessageTag.update 38 end 39 40 def destroy 41 @message = Message.find(params[:id]) 42 if current_user.id == @message.user.id 43 @message.destroy 44 redirect_to root_path 45 end 46 end 47 48 def search 49 set_search 50 end 51 52 private 53 def message_params 54 params.require(:message).permit(:title, :whom, :message, :open_plan, :name, :video, images: []).merge(user_id: current_user.id) 55 end 56 57 def search_message 58 @m = Message.ransack(params[:q]) 59 end 60 61 def set_search 62 @search = Message.ransack(params[:q]) 63 @search_messages = @search.result(distinct: true).order(created_at: "DESC").includes(:user) 64 end 65end
message_tab.rb(Formオブジェクト) class MessageTag include ActiveModel::Model include ActiveModel::Attributes include ActiveRecord::AttributeAssignment attr_accessor :title, :whom, :open_plan, :message, :images, :video, :name, :user_id with_options presence: true, length: { maximum: 50 } do validates :title validates :whom end with_options presence: true do validates :message, length: { maximum: 200 } validates :open_plan validates :user_id validates :name, length: { maximum: 20 } end def save @message = Message.create(title: title, whom: whom, open_plan: open_plan, message: message, images: images, video: video, user_id: user_id) tag = Tag.find_or_create_by(name: name) MessageTagForm.create(message_id: message.id, tag_id: tag.id) end def updateupdate @message = Message.find(params[:id]) @message = Message.create(title: title, whom: whom, open_plan: open_plan, message: message, images: images, video: video, user_id: user_id) tag = Tag.find_or_create_by(name: name) if MessageTagForm.update(message_id: message.id, tag_id: tag.id) return redirect_to root_path else render :edit end end end

edit

1<div class="new-message"> 2 <h1>残したい想い</h1> 3 <%= form_with model: @message, local: true do |f| %> 4 <%= render 'shared/error_messages', model: f.object %> 5 <div class="posting-form"> 6 <div class="form"> 7 タイトル 8 <span class="indispensable">必須</span> 9 </div> 10 <%= f.text_field :title, class:"form-title", id:"form-title", placeholder:"タイトル名(必須 50文字以内)", maxlength:"50" %> 11 <div class="form"> 12 メッセージ 13 <span class="indispensable">必須</span> 14 </div> 15 <%= f.text_area :message, class:"form-message", id:"form-message", placeholder:"メッセージ内容(必須 200文字以内)例)20年後の子供の誕生日に見て欲しい動画です。" ,rows:"5", maxlength:"200" %> 16 <div class="form"> 17 誰に対してか 18 <span class="indispensable">必須</span> 19 </div> 20 <%= f.text_field :whom, class:"form-whom", id:"form-whom", placeholder:"誰に宛てたものか(必須 50文字以内)例)20年後の子どもたちへ", maxlength:"50" %> 21 <div class="form"> 22 開封予定日 23 <span class="indispensable">必須</span> 24 </div> 25 <div class="form-open-plan"> 26 <%= raw sprintf( 27 f.date_select( 28 :open_plan, 29 class: 'open-plan-object', 30 use_month_numbers: true, 31 prompt:'--', 32 start_year: (Time.now.year), 33 end_year: (Time.now.year + 100), 34 date_separator: '%s'), 35 "<p> 年 </p>", "<p> 月 </p>") + "<p> 日 </p>" %> 36 </div> 37 <div class="form-caution"> 38 ※※※画像か動画どちらか1つの投稿にしてください。※※※ 39 </div> 40 <div class="image-form"> 41 <div class="form"> 42 届ける想い(画像) 43 </div> 44 <div class="click-upload"> 45 <p>クリックしてファイルをアップロード</p> 46 <%= f.file_field :images, name: 'message_tag[images][]', id:"form-image" %> 47 <div id="image-list"></div> 48 </div> 49 </div> 50 <div class="video-form"> 51 <div class="form"> 52 届ける想い(動画) 53 </div> 54 <div class="click-upload"> 55 <p>クリックしてファイルをアップロード</p> 56 <%= f.file_field :video, id:"form-video" %> 57 </div> 58 </div> 59 <div class="tag-form"> 60 タグ 61 </div> 62 <%= f.text_field :name, id:"form-tag", placeholder:"誕生日", maxlength:"20"%> 63 </div> 64 <div class="message-btn-contents"> 65 <%= f.submit "想いを更新する" ,class:"message-btn" %> 66 <%= link_to 'もどる', root_path, class:"back-btn" %> 67 </div> 68 <% end %> 69 70</div>
35: def update 36: @message = Message.find(params[:id]) => 37: binding.pry 38: @message = MessageTag.update(message_params) 39: end [1] pry(#<MessagesController>)> params => <ActionController::Parameters {"_method"=>"patch", "authenticity_token"=>"IpLwOPQlpeuAei8d+q0w6Q0kR57su7EmX9hk+ClskjYHMY13RNcdjwLDDqQv2Y+yxu59jGjfFS9gj7DMfuqLAQ==", "message"=>{"title"=>"アイウエオ", "message"=>"更新", "whom"=>"さしすせそ", "open_plan(1i)"=>"2022", "open_plan(2i)"=>"2", "open_plan(3i)"=>"2", "name"=>"更新"}, "commit"=>"想いを更新する", "controller"=>"messages", "action"=>"update", "id"=>"87"} permitted: false> [2] pry(#<MessagesController>)> message_params => <ActionController::Parameters {"title"=>"アイウエオ", "whom"=>"さしすせそ", "message"=>"更新", "open_plan(1i)"=>"2022", "open_plan(2i)"=>"2", "open_plan(3i)"=>"2", "name"=>"更新", "user_id"=>1} permitted: true>

試したこと

message_tagにupdateが未定義となっているのでmessage_tagにupdateを定義しましたが更新できませんでした

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

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

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

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

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

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

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

guest

回答2

0

いくつか問題があります。
まず MessageTag には update が無いのは事実ですね。あるのは updateupdateです。

それをupdateになおしても params[:id] を使っていますが、modelにはparamsは伝わりません。引数で渡してください。

#MessagesController def update @message = MessageTag.update params # MessageTag def update(params) @message = Message.find(params[:id])

MessageTag#updateの中身が正しいかは見ていませんが、これで「質問の内容」はクリア出来るでしょう

投稿2021/02/03 23:38

winterboum

総合スコア23401

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

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

0

MessageTagをインスタンス化する必要があるのでは?
インスタンス化されてないからnilから呼び出し→NoMethodErrorと推察します。

updateならfindで対象データを持ってくるとかで。
Active Record の基礎#5.3 Update
【Rails】updateメソッドの使い方を徹底解説!

投稿2021/01/25 21:53

m.ts10806

総合スコア80857

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

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

shunxile

2021/01/26 02:03

>>m.ts10806さん 回答ありがとうございます。 message_tag.rbのupdateアクションでfindを用いてデータを持ってくるということですか? いちようそちらにfindを追記して編集したのですが同じくエラーが出るんですが、、、l
m.ts10806

2021/01/26 02:35

コードを追記してください。「書きました」という説明だけでは何も分かりません。 細かいですが「いちおう」ですね。
shunxile

2021/01/26 02:51

>>m.ts10806さん 失礼しました。追記いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問