Frage

Interessantes Segment des Code, den ich nicht bekommen kann zu arbeiten. Ich habe die folgenden Modelle / Beziehungen (unnötiger Code ausgeschlossen)

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

Die Form all diese Informationen anzuzeigen:

<% 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 %> 

Und der Controller Griff des einreichen:

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

Die html sieht sauber:

<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" />

Die eingereichten Parameter wie folgt aussehen:

{
...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"
  }
 }
}

I get „nicht definierte Methode‚service_subtype‘für #“ Fehler zurück und die einzige Tabelle nicht aktualisiert ist die Join-Tabelle zwischen den HABTM Modellen. Jede Idee, wie zu lösen dieses oder das, was hinter den Kulissen geschieht? Ich bin mir nicht sicher, ob ich die „Magie“ zu verstehen hinter diesem Verfahren geschieht es, um zu sehen arbeiten. Es scheint, wie die meisten sagen, dass HABTM Arbeit mit verschachtelten Attributen tut. Scheint der Fall zu sein. Workarounds?

War es hilfreich?

Lösung 2

gefunden, dass Fehler, war in meinem Mailer. In jedem Fall ist die fields_for: wurde Subtypen Erzeugung noch nicht die richtigen Parameter für die Magie von verschachtelten Attributen zu holen, was ich zu tun versuche,

.

Was ich am Ende mit:

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
Dieses

ist irgendwie hackish Ich fühle mich, und ich bin nicht sicher, ob ich mit ihm völlig zufrieden bin, wie die Antwort, aber es stellt eine durch Kommata getrennte Liste in meinem versteckten Feld, das ich zu service_subtype_ids analysieren kann wieder auf einreichen.

Wenn jemand weiß, wie es ohne dieses zusätzliche virtuelle param zu tun, ich würde gerne wissen.

Danke für die Hilfe.

Andere Tipps

Unter der Annahme, dies ist kein Kopieren und Einfügen Fehler im Service-Modell, es könnte die Ursache des Problems sein.

 accepts_nested_attributes_for :services_subtypes

sollte

 accepts_nested_attributes_for :service_subtypes

Die ersten Argumente accepts_nested_attributes_for sollte ein Verein wie definiert durch eine has_many, has_and_belongs_to_many oder belongs_to Anweisung sein.

Ihr zweites kleines Problem an der Doppel Erzeugung des versteckten Feldes kommt aus dem es in den fields_for Abschnitt eingefügt wird. fields_for enthält automatisch ein verstecktes Feld für die ID. So dass es sicher die versteckte Feld Zeile aus dem folgenden Block zu entfernen.

<% fields.fields_for :service_subtypes do |subtype| %>
  <%= subtype.hidden_field :id %>
<% end %> 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top