Dans ma première Rails j'essaie d'utiliser form_for
et fields_for
pour créer un formulaire d'objet imbriqué. Jusqu'ici tout va bien, mais je ne peux pas comprendre comment accéder au sous-objet dans le fields_for
bloquer. J'ai pré-rempli un champ dans le sous-objet avec des données que je veux afficher dans les instructions d'utilisation.
Modèles
Garage:
has_many :cars, :dependent => :destroy
accepts_nested_attributes_for :cars
Voiture:
belongs_to :garage
Contrôleur de garage
def new
@garage = Garage.new
for i in 1..5
@garage.cars.build :stall_number => i
end
end
_ form.html.erb
<%= form_for @garage do |f| %>
<%= f.label :title, "Garage Name" %><br />
<%= f.text_field :title %>
<% f.fields_for :cars do |builder| %>
<p>Enter license for car parked in stall: <%= car.stall_number %></p>
<%= f.label :license, "License #:" %><br />
<%= f.text_field :license %>
<%= end %>
<%= end %>
Comme vous pouvez le voir, dans le bloc constructeur pour: voitures, je souhaite afficher, dans mes instructions d'utilisation, le champ: car.stall_number
(renseigné dans mon contrôleur avec un entier):
<p>Enter license for car parked in stall: <%= car.stall_number%></p>
J'ai essayé de nombreuses idées différentes: @car.stall_number
, object.car.stall_number
, etc. Pas de joie. Plusieurs recherches et un aperçu de la fields_for
le code source n'a pas aidé ma compréhension. J'apprécierais tout conseil.
pdate: Pour plus de précisions, selon la suggestion de Dan, j'ai essayé builder.stall_number
mais il en résulte un
NoMethodError: undefined method 'stall_number' for #<ActionView::Helpers::FormBuilder:0x00000102a1baf0>
Je viens de m'en occuper moi-même aujourd'hui.
Vous pouvez accéder à l'objet des champs_for par:
builder.object
où le générateur est votre objet de générateur de formulaire fields_for. Dans votre cas particulier, vous pouvez dire:
<p>Enter license for car parked in stall: <%= builder.object.stall_number%></p>
Cela devrait le faire pour vous!
La façon dont vous essayez ne fonctionne pas car vous voulez accéder à car
sans remplir cette variable pour les données.
Je suppose que vous voulez avoir plusieurs blocs de stands, où vous pouvez entrer des plaques d'immatriculation. Pour chaque stand, vous aurez besoin de votre propre fields_for
. Je suggérerais quelque chose comme ça:
<%= form_for @garage do |f| %>
<%= f.label :title, "Garage Name" %><br />
<%= f.text_field :title %>
<% for i in 1..5 %>
<% f.fields_for @garage.cars[i] do |builder| %>
<p>Enter license for car parked in stall: <%= builder.stall_number%></p>
<%= builder.label :license, "License #:" %><br />
<%= builder.text_field :license %>
<% end %>
<% end %>
<% end %>
Dans les champs_pour vous devez utiliser l'objet de formulaire que vous y définissez, dans ce cas le générateur. Étant donné que les données ne sont pas mappées à la forme externe (f), mais à l'objet voitures (constructeur).