Existe um método (ou maneira de obter funcionalidade semelhante) para fazer um fields_for_with_index
?
Exemplo:
<% f.fields_for_with_index :questions do |builder, index| %>
<%= render 'some_form', :f => builder, :i => index %>
<% end %>
Esse parcial sendo renderizado precisa saber qual é o índice atual no fields_for
loop.
ruby-on-rails
loops
fields-for
Shpigford
fonte
fonte
Respostas:
Na verdade, essa seria uma abordagem melhor, seguindo a documentação do Rails mais de perto:
De: http://railsapi.com/doc/rails-v3.0.4/classes/ActionView/Helpers/FormHelper.html#M006456
fonte
A resposta é bastante simples, pois a solução é fornecida pelo Rails. Você pode usar
f.options
params. Então, dentro do seu renderizado_some_form.html.erb
,O índice pode ser acessado por:
Você não precisa fazer mais nada.
Atualização: Parece que minha resposta não foi clara o suficiente ...
Arquivo HTML original:
Sub-formulário renderizado:
fonte
<%= f.options[:child_index] %>
seu sub-formulário renderizado (neste caso: _some_form.html.erb), não no originalbuilder
. Resposta atualizada para mais esclarecimentos.nil
issoA partir do Rails 4.0.2, um índice agora está incluído no objeto FormBuilder:
https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-fields_for
Por exemplo:
fonte
project_fields.options[:child_index]
. Então eu gosto mais assim!Para Rails 4+
Suporte do Monkey Patch para Rails 3
Para começar
f.index
a trabalhar no Rails 3 você precisa adicionar um monkey patch aos inicializadores de seus projetos para adicionar esta funcionalidade afields_for
fonte
.index
é muito mais limpo.Checkout Renderizando uma coleção de parciais . Se o seu requisito é que um modelo precise iterar sobre um array e renderizar um submodelo para cada um dos elementos.
Isso irá renderizar “_children.erb“ e passar a variável local 'children' para o modelo para exibição. Um contador de iteração será automaticamente disponibilizado para o modelo com um nome do formulário
partial_name_counter
. No caso do exemplo acima, o modelo seria alimentadochildren_counter
.Espero que isto ajude.
fonte
question_comment_form
sendo meu nome parcial ...Não consigo ver uma maneira decente de fazer isso através das formas fornecidas pelo Rails, pelo menos não em -v3.2.14
@Sheharyar Naseer faz referência às opções de hash que podem ser usadas para resolver o problema, mas não tanto quanto posso ver da maneira que ele parece sugerir.
Eu fiz isso =>
ou
No meu caso,
g.object_name
retorna uma string como esta"gallery_set[blog_posts_attributes][2]"
para o terceiro campo renderizado, então eu apenas combino o índice nessa string e o uso.Na verdade, uma maneira mais legal (e talvez mais limpa?) De fazer isso é passar um lambda e chamá-lo para incrementar.
E na vista
fonte
Eu sei que é um pouco tarde, mas recentemente tive que fazer isso você pode obter o índice de fields_for assim
Eu espero que isso ajude :)
fonte
Adicionado a fields_for child_index: 0
fonte
Se você deseja ter controle sobre os índices verifique a
index
opçãoIsso vai produzir
Se o formulário for enviado, os parâmetros incluirão algo como
Tive de usar a opção de índice para fazer meus vários menus suspensos funcionarem. Boa sorte.
fonte