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

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

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

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

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Q&A

1回答

1920閲覧

Railsにて、fields_forを用いてモデルを一括登録することは出来たが、一括編集をすることが出来ない

YoheiKobayashi

総合スコア15

Ruby on Rails 5

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

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

0グッド

1クリップ

投稿2020/06/08 01:48

編集2020/06/10 23:39

1.実現したいこと

初学者です。Rails(5.2.3)にて、1日にメモを3つ書き残すような仕組みをアプリケーションで実現したいと考えております。「モデルを一括登録する手順」を参考に、3つのメモを一括登録することは出来ましたが、その日に登録済みであるメモを、一括編集することも可能にしたい(もしくは、実装の方法or方針自体に問題があればご指摘いただきたい)と考えております。
(目次)
1.実現したいこと
2.試したこと
3.コード

※ 環境… Rails5.2.3 / mySQL

※ フォームイメージ ↓
イメージ説明

※ ファイル構成…

「_form.html.haml」
→ 一括登録用フォーム。ここで一括編集も行いたい。createアクションは自動推測で呼べるが、updateアクションを呼び出せていない。

「memo_collection.rb」
→ 3つのメモを一括登録できるようにするために用意したmemo_collectionモデル。

「memos_controller.rb」
→ memoのコントローラ。updateアクションを呼び出すことが出来ていないので、ストロングパラメータ含め記述がまだ曖昧です。

※ Memoテーブル…

ColumnTypeOptions
user_idintegerforeign_key: true, null:false
memostringnull:false

Association -

  • belongs_to :user

2.試したこと

fields_forの上手な使い方」「form_withでnetsted_formを扱う方法」等も参考にさせて頂きましたが、一括編集の実現には至っておりません。

① 既に登録されているメモ「@todays_memos」のデータを使い、memo_collectionモデルを作成して、その際に各メモの主キーも読み込ませつつ、form_withに送り各メモidを判別させようとするも、エラー発生。方針はあっている気がするが実装方法が分からず挫折。
② form_withでの自動推測を諦め手動でパスできる方法を一次ソース等で調べたが、今回の場合でそれを実現する方法がわからない。
③ updateアクションへのパスは不可能と判断し、createメソッド内にて編集ロジックを組もうと思ったが、挫折。(そもそもナンセンスなやり方ですよね…)
④ 一括編集は不可能と判断し、「新規作成時に、その日登録済みのデータが存在した場合、先にそれらを全削除する」というロジックを組もうとしたが、これもナンセンスですね…
⑤ 一括編集は不可能と判断し、個別編集に切り替えたが、これではそもそものアプリケーションとしての要件を満たすことが出来ない。

参考にした記事

一括登録する方法はコチラを参考にしました → モデルを一括登録する手順
一括編集する方法はコチラを参考にしましたが、解決しませんでした → fields_forの上手な使い方 & form_withでnetsted_formを扱う方法

3.コード

※ 現時点では、編集画面で「保存する」を押すと、新たなレコードが3つ作成されてしまう…という状態です。

_form.html.haml(一括登録用フォーム。一括編集も出来ればここで行いたい…)
= form_with(model: memos, url: memos_path, local: true) do |form| - memos.collection.each do |memo| = fields_for 'memos[]', memo do |field| %br/ = field.text_field :memo %br/ = form.submit "保存する"
memo_collection.rb(3つのメモを一括で扱うためのモデル。)
class MemoCollection include ActiveModel::Conversion extend ActiveModel::Naming extend ActiveModel::Translation include ActiveModel::AttributeMethods include ActiveModel::Validations MEMO_NUM = 3 # 同時にユーザーを作成する数 attr_accessor :collection # 初期化メソッド def initialize(attributes = []) if attributes.present? self.collection = attributes.map do |value| Memo.new( memo: value['memo'], user_id: value['user_id'] ) end p self.collection else self.collection = MEMO_NUM.times.map{ Memo.new } end end # レコードが存在するか確認するメソッド def persisted? false end # コレクションをDBに保存するメソッド def save is_success = true ActiveRecord::Base.transaction do collection.each do |result| # バリデーションを全てかけたいからsave!ではなくsaveを使用 is_success = false unless result.save end # バリデーションエラーがあった時は例外を発生させてロールバックさせる raise ActiveRecord::RecordInvalid unless is_success end rescue p 'エラー' ensure return is_success end end
memos_controller.rb(memoコントローラ。updateアクションを呼び出すことが出来ていなく、中身記述もまだ曖昧。)
class MemosController < ApplicationController before_action :todays_memos, only: [:index, :update] def index @users = User.all @memos = MemoCollection.new end def create @memos = MemoCollection.new(memos_params) @memos.save redirect_to root_path end # 機能させることが出来ていないupdateアクション def update @todays_memos.update(update_memos_params) redirect_to root_path end private def memos_params params.require(:memos).map{|memo| memo.permit(:memo).merge(user_id: current_user.id)} end # 機能させることが出来ていないupdate用のストロングパラメータ def update_memos_params params.require(:memos).map{|memo| memo.permit(:id, :memo).merge(user_id: current_user.id)} end def todays_memos todays_memos = Memo.where(created_at: Time.current.all_day, user_id: current_user.id) if user_signed_in? @todays_memos = MemoCollection.new(todays_memos) if todays_memos.exists? end end

勉強不足で大変恐縮ですが、知恵をお貸しいただけば幸いです。

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

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

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

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

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

guest

回答1

0

私ならば、new.html.hamlとedit.html.hamlを作成し、<form action="それぞれ呼びたいメソッド"></form>をその中に書いてしまって、フォーム部品は_form.html.hamlとかに書いてそれぞれのformの内側にrenderで呼び出す形式を選びます。
hamlの書き方がわからないので参考コード書けませんが、erbならできるのでhamlでもたぶんできるでしょう。

投稿2020/06/19 08:29

perpouh

総合スコア299

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

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

YoheiKobayashi

2020/06/19 12:58

お返事頂き、ありがとうございます!大変勉強になります! 今回、index.html.haml上から_form.html.hamlへrenderし、同一ページ内で新規投稿も編集もできるようにしたく…ただ、教えていただいた内容で別途作ってやってみたいと思います。ありがとうございます! https://github.com/rails/rails/blob/7252c2133f6f44085c64b1876cf41902e6a73847/actionview/lib/action_view/helpers/form_helper.rb#L483-L738 https://pikawaka.com/rails/form_with 引き継き上記などを参考に、今回のようなケースでも、フォーム上でactionで呼びたいメソッドを指定できる方法を考えてみたいと思います。もし無理なら勉強中のvue.js等を使ってうまく出来ないかやってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問