私はreform-rails gemを使用しています。私のレールプロジェクトでフォームオブジェクトを利用するためです。レールは、コレクションが動作しないか検証されている改革柵のオブジェクトを形成します
フォームオブジェクトは、以下で使用するサンプルコードではおそらく過剰ですが、デモンストレーション用です。
user
を作成しており、そのユーザーレコードに関連付けられているフォームには、2つのuser_emails
があります。私はUser
モデル内accepts_nested_attributes_for :user_emails
を使用していない
# models/user.rb
class User < ApplicationRecord
has_many :user_emails
end
# models/user_email.rb
class UserEmail < ApplicationRecord
belongs_to :user
end
注意してください。フォームオブジェクトの主なポイントの1つは、accepts_nested_attributes_for
の使用を止めるのに役立つということです。だからこそ、これを使わずにこれをやろうとしています。私はthis videoからそのアイディアを得て、リファクタリング脂肪モデルについて話しています。私は、フォームオブジェクト上のビデオのセクションを指すリンクを持っており、彼はどれくらい嫌いなのかを表していますaccepts_nested_attributes_for
。
私はその後、私のuser_form
の作成に進む:
# app/forms/user_form.rb
class UserForm < Reform::Form
property :name
validates :name, presence: true
collection :user_emails do
property :email_text
validates :email_text, presence: true
end
end
のでuser_form
オブジェクトがuser
記録し、そのuser
レコードに関連したuser_email
レコードのカップルをラップします。 フォーム・レベルの検証がありuser
上とuser_email
上は、このフォームはラップレコード:
user#name
は、各user_email#email_text
が場合
値を持っている必要があります
user
レコードを作成し、次に関連する2つのレコードを作成する必要があります。user_email
フォームが有効でない場合は、フォームにエラー・メッセージを再表示する必要があります。 私はここまでコントローラに何があるかを示します。簡潔にするために:最後
# app/controllers/users_controller.rb
class UsersController < ApplicationController
def new
user = User.new
user.user_emails.build
user.user_emails.build
@user_form = UserForm.new(user)
end
def create
@user_form = UserForm.new(User.new(user_params))
if @user_form.valid?
@user_form.save
redirect_to users_path, notice: 'User was successfully created.'
else
render :new
end
end
private
def user_params
params.require(:user).permit(:name, user_emails_attributes: [:_destroy, :id, :email_text])
end
end
:フォーム自体:試験として
# app/views/users/_form.html.erb
<h1>New User</h1>
<%= render 'form', user_form: @user_form %>
<%= link_to 'Back', users_path %>
# app/views/users/_form.html.erb
<%= form_for(user_form, url: users_path) do |f| %>
<% if user_form.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(user_form.errors.count, "error") %> prohibited this user from being saved:</h2>
<ul>
<% user_form.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %>
<%= f.text_field :name %>
</div>
<% f.fields_for :user_emails do |email_form| %>
<div class="field">
<%= email_form.label :email_text %>
<%= email_form.text_field :email_text %>
</div>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
:new
のみ作用create
アクションを表示ここで入力された値を持つ形であります:
今すぐ提出します。何が起きるべきかは、2番目の電子メールの値が存在しなければならないため、検証エラーが発生するはずです。ただし、ここにログを投稿すると、ログは次のようになります。
Parameters: {"utf8"=>"✓", "authenticity_token"=>”123abc==", "user"=>{"name"=>"neil", "user_emails_attributes"=>{"0"=>{"email_text"=>"email_test1"}, "1"=>{"email_text"=>""}}}, "commit"=>"Create User"}
ActiveModel::UnknownAttributeError (unknown attribute 'user_emails_attributes' for User.):
私のフォームオブジェクトに問題があります。
このフォームオブジェクトを機能させるにはどうすればよいですか?reform_rails
を使用して、このフォームオブジェクトをなしでなしで使用することは可能ですか?accepts_nested_attributes
を使用していますか?最終的には、私はちょうどオブジェクトobjetを働かせたいと思っています。
私はすでに改革・レールのドキュメントに加えて、調査してきたいくつかのリソース:フォームオブジェクトを作成する
私の最初の試みはしていましたvirtus gemが、私はどちらかを動作させるように見えませんでした。私はその実装のためにstackoverflow questionを投稿しました。
Reformが、永続化されていない場合のパラメータからコレクションオブジェクトのインスタンス化と検証を処理する方法を確認したい場合があります。 'accepts_nested_attributes_for'には、たとえば空白を拒否するオプションがあります。 – coreyward