経由属性:ビューにRailsは、私は次の情報をRailsの5.1アプリ実行していますフォーム
モデル
class Company < ApplicationRecord
has_many :complaints
accepts_nested_attributes_for :complaints
validates :name, presence: true
end
class Complaint < ApplicationRecord
belongs_to :company
validates :username, :priority, presence: true
end
コントローラ
class ComplaintController < ApplicationController
def new
@company = Company.new
@company.complaints.build
end
def create
@company = Company.new(company_params)
respond_to do |format|
if @company.save
format.html { redirect_to complaint_url }
else
format.html { render :new }
end
end
end
private
def company_params
params.require(:company).permit(:name, complaints_attributes: [:username, :priority])
end
フォームを
<%= form_for @company do |f| %>
<%= f.label :name, "Company" %>
<%= f.text_field :name, type: "text" %>
<%= f.fields_for :complaints do |complaint| %>
<%= complaint.label :username, "Username" %>
<%= complaint.text_field :username %>
<%= complaint.label :priority, "Priority" %>
<%= complaint.text_field :priority %>
<% end %>
<%= f.submit 'Submit' %>
<% end %>
フォームのcomplaint_attributes
部分の入力フィールドを1つだけ入力してください(つまり、上記のようにusernameのフィールドとpriorityのフィールドはそれぞれ1つだけです)。
しかし、フォーム内にユーザー名と優先度のフィールドを複数設定したいので、1つの送信で複数のユーザー名と優先度の組み合わせを送信できるようにするには、フォームを送信すると最後のユーザー名と優先度フォームからの値。このビューの例は次のようになります。
<%= form_for @company do |f| %>
<%= f.label :name, "Company" %>
<%= f.text_field :name, type: "text" %>
<%= f.fields_for :complaints do |complaint| %>
<div>
<%= complaint.label :username, "Username" %>
<%= complaint.text_field :username %>
<%= complaint.label :priority, "Priority" %>
<%= complaint.text_field :priority %>
</div>
<div>
<%= complaint.label :username, "Username" %>
<%= complaint.text_field :username %>
<%= complaint.label :priority, "Priority" %>
<%= complaint.text_field :priority %>
</div>
<% end %>
<%= f.submit 'Submit' %>
<% end %>
は私がフォームを送信するとき、私は(単一の苦情提出するため)、このようなハッシュを取得することに気づいた:
{"utf8"=>"✓", "authenticity_token"=>"...", "company"=>{"name"=>"Test", "complaints_attributes"=>{"0"=>{"username"=>"test_person", "priority"=>"1"}}}, "commit"=>"Submit"}
を変更するにはどのような方法がありますこれに対して、それは似て作ると、それはDBに保存されて持っているのparams?:
{"utf8"=>"✓", "authenticity_token"=>"...", "company"=>{"name"=>"Test", "complaints_attributes"=>{"0"=>{"username"=>"test_person", "priority"=>"1"}"1"=>{"username"=>"test_person", "priority"=>"2"}}}, "commit"=>"Submit"}
それともそうでない場合は、A複数のフィールドを単一のフォームで使用する場合、ユーザー名と優先度の値を保存するにはどうすればよいでしょうか?
編集:必要に応じてユーザー名/優先度フィールドグループを動的に追加できるので、設定された番号に制限したくないという点を指摘しておきます。
def new
@company = Company.new
3.times { @company.complaints.build }
end
し、次の形式でそれは苦情あなたの数に応じて入力に生成する必要があります:
FYIあなたの 'EDIT'は完全に別の質問になります.... – gabrielhilal
はい - それを指摘していない私の謝罪。私は、最初の回答が掲載されるとすぐにそれを認識しました。 – Wes