2017-05-17 4 views
0

経由属性:ビューに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 

し、次の形式でそれは苦情あなたの数に応じて入力に生成する必要があります:

+0

FYIあなたの 'EDIT'は完全に別の質問になります.... – gabrielhilal

+0

はい - それを指摘していない私の謝罪。私は、最初の回答が掲載されるとすぐにそれを認識しました。 – Wes

答えて

0

第2のブロックがあなたの代わりに、コントローラに多くの苦情を構築する必要があります...最初のフィールドを上書きします

<%= 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 %> 
+0

私はこれを試しましたが、最後のブロックは他のブロックを引き続きオーバーライドしているため、最後のブロックだけが保存されます。 編集:無視 - これは機能します。ただし、フィールドの数はあらかじめ設定されています。必要に応じてフィールドを動的に追加する方法があればどうしますか? – Wes

+0

おかげさま...コントローラに到着したパラメータを教えてください。 – gabrielhilal

+0

私は上記の私のコメントを編集しました。それは動作しますが、動的なフィールドがある場合はどうなりますか? – Wes

関連する問題