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

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

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

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

Ruby on Rails 6

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

Ruby on Rails

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

Q&A

解決済

1回答

1838閲覧

同じモデルの複数レコードを同時に登録したい

no1knows

総合スコア3365

Ruby

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

Ruby on Rails 6

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/08/22 06:11

招待機能として、下記のような実装をしたいと思っています。


・1つのフォームでInviteモデルのmailカラムを複数同時に登録したい
・バリデーションが効くようにしたい
・accept_nested_attributes_forは使わない


イメージ説明


下記のどちらかご回答いただけると助かります。
どうぞよろしくお願いいたします!

質問①

accept_nested_attributes_forを利用せずに、Railsではどのように実装するのが標準な形なのでしょうか?
また参考になるリンクなどを教えていただければ助かります。

質問②

フォームから配列形式でメールアドレスを取得する形でうまくいくのではと思って実装をすすめました。
この際のstrong_parameterの設定方法を教えていただければと思います。

下記では、strong_parameterでfalseが出てしまいました。
strong_parameterをRailsガイドのネストしたパラメータを参考にいろいろな値を試しましたがうまく実装することができませんでした。

またそもそもこのような実装方法でバリデーションは効くのでしょうか?

ruby

1_form.html.erb 2 3<%= form_with(model: invite, local: true) do |form| %> 4 <% 2.times do |i| %> 5 <div class="field"> 6 <%= form.text_field :invite, name: "invite[][mail]" %> 7 </div> 8 <% end %> 9 <div class="actions"> 10 <%= form.submit %> 11 </div> 12<% end %> 13

出来上がったForm

<form action="/invites" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="edn+7mV7v4W91ig/T7oAFmDn/VLsmHeXwka5mUd0q8YyExCKO2Ve0kD4j3zLEvmcbVSS+cAvgmEPuqHhOuhgow=="> <div class="field"> <input name="invite[][mail]" type="text" id="invite_invite"> </div> <div class="field"> <input name="invite[][mail]" type="text" id="invite_invite"> </div> <div class="actions"> <input type="submit" name="commit" value="Create Invite" data-disable-with="Create Invite"> </div> </form>

設定したストロングパラメータ

def invite_params params.require(:invite).permit([:mail]) end

取得したパラメータ

Request parameters {"authenticity_token"=>"oGR/ffIANP1b4RVcFbtj8keyWE・・・・・", "invite"=>[{"mail"=>"come@example.com"}, {"mail"=>"go@example.com"}], "commit"=>"Create Invite", "controller"=>"invites", "action"=>"create"}

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

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

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

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

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

guest

回答1

0

自己解決

##【追記】下記をテストしたところ特定の条件でうまくバリデーションができない問題がでてきましたので、参考にしないようにお願いします。

Formオブジェクトなどを使って実装することをおすすめします。

ひとまず下記にて実装できました。

Ruby

1#invite.rb 2class Invite < ApplicationRecord 3 attr_accessor :mail1, :mail2, :mail3 4 5 validates :mail1, presence: true, allow_blank: true 6 validates :mail2, presence: true, allow_blank: true 7 validates :mail3, presence: true, allow_blank: true 8 9 def self.bulk_create(mails) 10 all_valid = true 11 12 Invite.transaction(joinable: false, requires_new: true) do 13 mails.each do |mail| 14 @invite = Invite.new(mail: mail) 15 all_valid &= @invite.save(validate: false) 16 end 17 18 unless all_valid 19 raise ActionRecord::Rollback 20 end 21 end 22 all_valid 23 end 24end

Ruby

1#invites_controller.rb 2class InvitesController < ApplicationController 3 4 def create 5 @invite = Invite.new(invite_params) 6 7 if @invite.valid? == false 8 render :new 9 else 10 mails = [invite_params[:mail1], invite_params[:mail2], invite_params[:mail3]].reject(&:blank?) 11 invite.bulk_create(mails) 12 redirect_to invites_url 13 end 14 end 15 16 private 17 def invite_params 18 params.require(:invite).permit(:mail1, :mail2, :mail3) 19 end 20end

erb

1#_form.html.erb 2<%= form_with(model: invite, local: true) do |form| %> 3 <% if invite.errors.any? %> 4 <div id="error_explanation"> 5 <h2><%= pluralize(invite.errors.count, "error") %> prohibited this invite from being saved:</h2> 6 7 <ul> 8 <% invite.errors.full_messages.each do |message| %> 9 <li><%= message %></li> 10 <% end %> 11 </ul> 12 </div> 13 <% end %> 14 15 <div class="field"> 16 <%= form.text_field :mail1 %> 17 </div> 18 <div class="field"> 19 <%= form.text_field :mail2 %> 20 </div> 21 <div class="field"> 22 <%= form.text_field :mail3 %> 23 </div> 24 25 <div class="actions"> 26 <%= form.submit %> 27 </div> 28<% end %>

投稿2020/08/24 00:44

編集2020/08/24 06:50
no1knows

総合スコア3365

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問