web-dev-qa-db-fra.com

Nom d'étiquette personnalisé d'association de formulaire simple

J'ai du mal avec ce que je perçois comme un problème simple:

Travailler dans Rails 3.0.8 avec le gem simple_form 1.4.

J'ai deux modèles, les propriétaires et les types de propriétaire;

class Owner < ActiveRecord::Base
  belongs_to :own_type
  attr_accessible :name, :own_type_id
end

class OwnerType < ActiveRecord::Base
  has_many :owners
  attr_accessible :name, :subtype_name
end

Dans la partie partielle _form de la vue Propriétaire, je souhaite avoir une zone de sélection qui affiche à la fois le nom et le sous-type_nom de l'association propriétaire_type.
.... quelque chose comme ceci: Type de propriétaire: [nom | nom_sous-type], par exemple. [Gouvernement | Fédéral]; [Gouvernement | Municipal]

Ma vue contient maintenant: app/vues/propriétaires/_form.html.erb

<%= simple_form_for @owner do |f| %>
  <%= f.error_messages %>
  <%= f.input :name %>
  <%= f.association :owner_type, :include_blank => false %>
  <%= f.button :submit %>
<% end %>

... la f.association ne répertorie que le champ owner_type.name par défaut. Comment spécifiez-vous différents champs, ou dans mon cas deux champs?

Toute aide est appréciée; Merci d'avance.

DJ

36
dj_44

Vous devrez utiliser l'option: label_method pour cela.

<%= f.association :owner_type, :include_blank => false, :label_method => lambda { |owner| "#{owner.name} | #{owner.subtype_name}" } %>

ou, si vous définissez une méthode select_label sur la classe du propriétaire, vous pouvez faire

<%= f.association :owner_type, :include_blank => false, :label_method => :select_label %>
84
Dogbert

La façon la plus simple de le faire est d'implémenter une méthode to_label sur votre modèle. Comme ça:

class OwnerType < ActiveRecord::Base
  def to_label
    "#{name} | #{subtype_name}"
  end
end

Par défaut, SimpleForm recherchera ces méthodes sur votre modèle et l'utilisera comme label_method, dans cet ordre:

:to_label, :name, :title, :to_s

Vous pouvez également modifier cette option sur votre initialiseur simple_form.rb, ou vous pouvez passer un bloc ou une méthode à :label_method option de votre saisie.

50
rafaelfranca