2017-03-08 8 views
1

私はfields_forを使用してネストされた属性のフィールドのサブセクションを作成できることを理解しています。しかし、私はそれらのフォームを分割したいと思います。これどうやってするの?例えばRails - ネストされた属性をフォームで分割する方法

このように、私はネストされたバーモデルとモデルのfooがあるとします。

<%= form_for @foo do |f| %> 
    <!-- foo fields --> 

    <%= f.fields_for :bars do |f_bar| %> 
    <!-- bar fields --> 
    <% end %> 

    <%= f.submit "Submit" %> 
<% end %> 

class Foo < ApplicationRecord 
    has_many :bars 
    accepts_nested_attributes_for :bars 
end 

一般的な見解はこのようなものになるだろう

しかし、審美的な理由から、私はすべてbarsを1か所で凝集させたくありません。私はすべてのbars一度に表示するために持っていなかったのであれば、それは私のために完璧になる

<%= form_for @foo do |f| %> 
    <!-- foo fields --> 

    <%= f.fields_for :bars do |f_bar| %> 
    <!-- bar fields of one bar --> 
    <% end %> 

    <!-- other foo fields --> 

    <%= f.fields_for :bars do |f_bar| %> 
    <!-- bar fields of another bar --> 
    <% end %> 

    <!-- The previous repeats many more times in a non predictable way --> 

    <%= f.submit "Submit" %> 
<% end %> 

:私のような何かをしたいと思います。誰かがそれを知っていますか?

+1

:私はちょうどカウンターを作成し、時間当たり1 @foo.bars[counter]を追加し、それは魔法のように働いたので、それはこのようなものでしたか? –

+0

'@ foo'のようにインスタンス変数を渡すことができます。単一のバーをインスタンス変数にフィルタリングし、ビューで使用できるコントローラ内の別の変数に置きます。 – vee

+0

単一変数の数は決定されません。これは単なる例だった。 –

答えて

0

だから、私が必要としたのは、fields_forが時間ごとに1つのインスタンスしか表示しないということでした。

fields_forは、フィールドをレンダリングする特定のオブジェクトを指定できることを発見しました。あなたはそれを試してみました

<% counter = 0 %> 
<%= form_for @foo do |f| %> 

    <!-- foo fields --> 

    <%= f.fields_for :bars, @foo.bars[counter] do |f_bar| %> 
    <!-- bar fields of one bar --> 
    <% end %> 
    <% counter+=1 %> 

    <!-- other foo fields --> 

    <%= f.fields_for :bars, @foo.bars[counter] do |f_bar| %> 
    <!-- bar fields of another bar --> 
    <% end %> 
    <% counter+=1 %> 

    <!-- The previous repeats many more times in a non predictable way --> 

    <%= f.submit "Submit" %> 
<% end %> 
1

あなたはfields_forの第二のparamを使用してスコープを渡すことができます:あなたの形態では

class Bar < ApplicationRecord 

    belongs_to :foo 

    scope :some_a,->{where(conditions)} 
    scope :some_b,->{where(conditions)} 

end 

<%= form_for @foo do |f| %> 
    <%= f.text_field :foo_attr %> 

    <%= f.fields_for :bars, @foo.bars.some_a do |b| %> 
     <%= b.hidden_field :other_bar_attr %> 
     <%= b.text_field :bar_attr %> 
     ... 
    <% end %> 

    <%= f.fields_for :bars, @foo.bars.some_b do |b| %> 
     <%= b.hidden_field :other_bar_attr %> 
     <%= b.text_field :bar_attr %> 
     ... 
    <% end %> 
    <%= f.submit %> 
<% end %> 

あなたがスコープで使用されているデフォルト値を設定するための隠し入力を使用することができます。

UPDATE

あなたの形式でfields_forの複数のインスタンスを使用する必要がある場合は、スコープのオブジェクトの配列、例は、可能性が設定され、コントローラでは、この

ような何かを行うことができます:

class SomeController < AP 
    def some_action 
    @var_to_the_form = [] 
    (1..well_know_quantity).each do |value| 
     @var_to_the_form << Model.where(conditions) 
    end 
    end 
end 

そして、あなたのフォームは

<% @var_to_the_form.each do |records| %> 
    <%= f.fields_for :bars, records do |b| %> 
    <%= b.hidden_field :other_bar_attr %> 
    <%= b.text_field :bar_attr %> 
     ... 
    <% end %> 
<% end %> 
を次のようにする必要があり

重要な部分は、ビューに渡すレコードを設定する方法を理解することです。

+0

私はあなたのソリューションが好きでしたが、実際には私の問題には合致しませんでした。なぜなら、スコープは多く、予測できないからです。 –

+0

は、スコープは予測できないと言っていますか?あるいは、あなたのビュー内の 'fields_for'の数がすべてのケースで同じではないと言っていますか? – rogelio

+0

すべての場合に 'fields_for 'の数が同じではないことがわかりました。混乱のためにsry:/ –

関連する問題