2012-05-14 8 views
5

Uso le guide per creare un nuovo prodotto e desidero aggiungere una categoria a ogni prodotto.Attributi nidificati Rails: come aggiungere l'attributo category al nuovo prodotto?

Ho tre tabelle: prodotto, categoria e categorizzazioni (che memorizza la relazione tra prodotti e categorie). Sto cercando di utilizzare gli attributi nidificati per gestire la creazione delle categorizzazioni, ma non so come aggiornare il mio controller e la vista/modulo in modo che i nuovi prodotti aggiornino anche la tabella delle categorizzazioni.

Qui sono i miei modelli:

class Product < ActiveRecord::Base 
belongs_to :users 
has_many :categorizations 
has_many :categories, :through => :categorizations 
has_attached_file :photo 
accepts_nested_attributes_for :categorizations, allow_destroy: true 

attr_accessible :description, :name, :price, :photo 

validates :user_id, presence: true 

end 


class Category < ActiveRecord::Base 
attr_accessible :description, :name, :parent_id 
acts_as_tree 
has_many :categorizations, dependent: :destroy 
has_many :products, :through => :categorizations 

end 


class Categorization < ActiveRecord::Base 
    belongs_to :category 
    belongs_to :product 
    attr_accessible :category_id, :created_at, :position, :product_id 

end 

Ecco il mio nuovo controller di prodotto:

def new 
    @product = Product.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @product } 
    end 
    end 

E qui è la mia forma vista:

<%= form_for @product, :html => { :multipart => true } do |f| %> 
    <% if @product.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2> 

     <ul> 
     <% @product.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :description %><br /> 
    <%= f.text_field :description %> 
    </div> 
    <div class="field"> 
    <%= f.label :price %><br /> 
    <%= f.number_field :price %> 
    </div> 
<div class="field"> 
<%= f.file_field :photo %> 
</div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

Come devo aggiornare il mio controller in modo che sia il prodotto sia le tabelle di categorizzazione vengano aggiornati quando viene aggiunto un nuovo prodotto? Come aggiorno il mio file di visualizzazione in modo che le categorie vengano visualizzate in un menu a discesa?

+0

* ma sicuri di come il mio ... la vista/il modulo dovrebbero essere aggiornati * - non abbiamo nemmeno idea perché non li hai esposti. – jdoe

+0

Ciao @jdoe - Ho aggiunto il file di visualizzazione qui. Solo quello standard creato dal comando genera guide. –

risposta

4

Vedo che il prodotto ha diverse categorie. È naturalmente permesso all'utente di specificarli alla creazione/edizione del prodotto. Un approccio è descritto here (tramite caselle di controllo per assegnare categorie al prodotto). Un altro modo: creare prodotti come di solito e consentire l'aggiunta/rimozione di categorie sulla sua pagina di modifica, come:

cat_1 [+] 
cat_2 [-] 
cat_3 [+] 

prendere anche uno sguardo a Railcasts, come this one per farlo su un modo più bello.

0

Prima di tutto per mostrare le categorie di file di visualizzazione uso qualcosa come segue per mostrare categoria in discesa

<%= select_tag("category_id[]", options_for_select(Category.find(:all).collect { |cat| [cat.category_name, cat.id] }, @product.category.collect { |cat| cat.id}))%> 

Poi, nel creare il metodo di controllo del prodotto fare qualcosa di simile in seguito

@product = Product.create(params[:category]) 
@product.category = Category.find(params[:category_id]) if params[:category_id] 

Spero che questo ti aiuterebbe.
Grazie.

0

Esercitazione per modulo modello nidificato da RailsCasts Forse l'aiuto, o forse aiuterà qualcun altro.

0

Ecco quello che ho addded al mio file di vista del prodotto, in _form.html - questo ha creato più caselle di controllo che potrei usare per selezionare più categorie per prodotto:

</div class="field"> 
<% Category.all.each do |category| %> 
<%= check_box_tag "product[category_ids][]", category.id %> 
<%= label_tag dom_id(category), category.name %><br> 
<% end %>