web-dev-qa-db-fra.com

Rails - En utilisant form_for et fields_for, comment accédez-vous au sous-objet dans le bloc fields_for?

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>
46
Don Leatham

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!

81
CharlieMezak

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).

3
Dan