Question

secteur intéressant de code que je ne peux pas se rendre au travail. Je les modèles suivants / relations (code inutile exclu)

class Service < ActiveRecord::Base
  belongs_to :service_category, :foreign_key => "cats_uid_fk"
  belongs_to :service_type, :foreign_key => "types_uid_fk"
  has_and_belongs_to_many :service_subtypes, :join_table => "services_to_service_subs"
  belongs_to :service_request, :foreign_key => "audits_uid_fk"

  accepts_nested_attributes_for :service_subtypes
end

class ServiceSubtype < ActiveRecord::Base
  belongs_to :service_types, :foreign_key => "types_uid_fk"
  has_and_belongs_to_many :services, :join_table => "services_to_service_subs"
end

La forme afficher toutes ces informations:

<% form_for(@request, :url => { :action => :create }) do |form| %>
 <table>   

...other data...

 <% form.fields_for :services do |fields| %>
  <%= fields.hidden_field :cats_uid_fk %>
  <%= fields.hidden_field :types_uid_fk %>
  <% fields.fields_for :service_subtypes do |subtype| %>
   <%= subtype.hidden_field :id %>
  <% end %> 
 <% end %>   

 <p>
   <%= form.submit "Create", :class=>"hargray" %>
 </p>         
<% end %> 

Et le contrôleur pour gérer le présenter:

def create
 logger.debug params[:service_request].inspect

 @request = ServiceRequest.new(params[:service_request])
 if session[:cus_id]
  @request.customer = Customer.find session[:cus_id]
 end

 begin      
  @request.save!
  flash[:notice] = "Information submitted successfully. You will be contacted by a customer service representative regarding the services you selected."
  redirect_to :controller => "customer", :action => "index"
 rescue Exception => exc
  flash[:notice] = "#{ format_validations(@request) } - #{exc.message}"
  render :action => "new"
 end

end

Le html semble propre:

<input id="service_request_services_attributes_0_cats_uid_fk" name="service_request[services_attributes][0][cats_uid_fk]" type="hidden" value="1" />
  <input id="service_request_services_attributes_0_types_uid_fk" name="service_request[services_attributes][0][types_uid_fk]" type="hidden" value="1" />
  <input id="service_request_services_attributes_0_service_subtypes_attributes_0_id" name="service_request[services_attributes][0][service_subtypes_attributes][0][id]" type="hidden" value="2" />
   <input id="service_request_services_attributes_0_service_subtypes_attributes_0_id" name="service_request[services_attributes][0][service_subtypes_attributes][0][id]" type="hidden" value="2" />
  <input id="service_request_services_attributes_0_service_subtypes_attributes_1_id" name="service_request[services_attributes][0][service_subtypes_attributes][1][id]" type="hidden" value="4" />
   <input id="service_request_services_attributes_0_service_subtypes_attributes_1_id" name="service_request[services_attributes][0][service_subtypes_attributes][1][id]" type="hidden" value="4" />

Les paramètres soumis ressemblent à ceci:

{
...other data...
 "services_attributes"=> {
  "0"=> {
   "types_uid_fk"=>"1", 
   "service_subtypes_attributes"=> {
    "0"=>{"id"=>"1"}, 
    "1"=>{"id"=>"2"}, 
    "2"=>{"id"=>"3"}
   }, 
   "cats_uid_fk"=>"1"
  }
 }
}

Je reviens « méthode non définie « service_subtype » pour # » erreur et la seule table est pas mis à jour la table de jointure entre les modèles HABTM. Toute idée comment résoudre ce ou ce qui se passe dans les coulisses? Je ne suis pas sûr que je comprends la « magie » qui se passe derrière cette procédure pour le voir travailler. Il semble que la plupart disent que HABTM ne marche pas le travail avec des attributs imbriqués. Cela semble être le cas. Contournements travail?

Était-ce utile?

La solution 2

Trouvé cette erreur, était dans mes mailers. Dans tous les cas, les sous-types: fields_for est toujours pas générer les bons paramètres pour la magie des attributs imbriqués pour revenir sur ce que je voulais faire

.

Ce que je finis avec est:

new.erb

<% form.fields_for :services do |fields| %>
    <%= fields.hidden_field :wsi_web_serv_cats_uid_fk %>
    <%= fields.hidden_field :wsi_web_serv_types_uid_fk %>
    <%= fields.hidden_field :service_subs_hash %>
<% end %>

service.rb

def service_subs_hash
    self.service_subtype_ids.join(", ")
end

def service_subs_hash=(ids)
    self.service_subtype_ids = ids.split(",")
end

Ceci est un peu hackish je me sens et je ne suis pas sûr que je suis tout à fait satisfait que la réponse, mais il met une liste séparée par des virgules dans mon champ caché que je peux analyser à nouveau sur service_subtype_ids soumettre.

Si quelqu'un sait comment le faire sans que cela virtuel supplémentaire param, j'aimerais savoir.

Merci pour l'aide.

Autres conseils

En supposant qu'il ne soit pas une erreur de copier coller dans le modèle de service, il pourrait être la source de votre problème.

 accepts_nested_attributes_for :services_subtypes

doit être

 accepts_nested_attributes_for :service_subtypes

Les premiers arguments à accepts_nested_attributes_for devraient être une association telle que définie par un has_many, has_and_belongs_to_many ou belongs_to déclaration.

Votre deuxième problème mineur au sujet de la double production du champ caché vient de votre insérer dans la section fields_for. fields_for inclut automatiquement un champ caché pour l'id. Assurer la sécurité pour enlever la ligne de champ caché du bloc suivant.

<% fields.fields_for :service_subtypes do |subtype| %>
  <%= subtype.hidden_field :id %>
<% end %> 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top