Domanda

segmento interessante di codice che non posso andare al lavoro. Ho i seguenti modelli / relazioni (codice non necessario escluso)

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 forma la visualizzazione di tutte queste informazioni:

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

E il controllore per gestire la conferma:

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

Il html sembra pulito:

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

I parametri presentati simile a questa:

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

torno "metodo non definito 'service_subtype' per #" di errore e l'unico tavolo non aggiornato è la tabella di giunzione tra i modelli HABTM. Qualsiasi idea di come risolvere questo o quello che sta accadendo dietro le quinte? Io non sono sicuro di aver capito la "magia" accade dietro questa procedura per vederlo lavorare. Sembra che la maggior parte dicono che HABTM non lavorare con gli attributi nidificati. Sembra essere il caso. arounds di lavoro?

È stato utile?

Soluzione 2

Trovato tale errore, era nei miei programmi di posta. In ogni caso, i fields_for: sottotipi era ancora non generano i giusti parametri per la magia di attributi nidificati a salire su quello che stavo cercando di fare

.

Quello che io alla fine con è:

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

Questo è un pò hackish mi sento e non sono sicuro io sono totalmente soddisfatto con esso, come la risposta, ma mette un elenco separato da virgole nel mio campo nascosto che posso analizzare a service_subtype_ids nuovo su inviare.

Se qualcuno sa come farlo senza questo parametro virtuale in più, mi piacerebbe sapere.

Grazie per l'aiuto.

Altri suggerimenti

Supponendo che questo non è un errore di copia incolla nel modello di servizio, potrebbe essere la causa del problema.

 accepts_nested_attributes_for :services_subtypes

Dovrebbe essere

 accepts_nested_attributes_for :service_subtypes

I primi argomenti per accepts_nested_attributes_for dovrebbero essere un'associazione come definito da un has_many, has_and_belongs_to_many o belongs_to dichiarazione.

Il secondo problema minore circa il doppio di generazione del campo nascosto viene dal vostro inserendolo nella sezione fields_for. fields_for include automaticamente un campo nascosto per l'id. Rendendolo sicuro per rimuovere la linea di campo nascosto dal blocco successivo.

<% fields.fields_for :service_subtypes do |subtype| %>
  <%= subtype.hidden_field :id %>
<% end %> 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top