2012-05-14 6 views
5

Estoy utilizando raíles para crear un nuevo producto y quiero agregar una categoría a cada producto.Rails atributos anidados: cómo agregar un atributo de categoría al nuevo producto?

Tengo tres tablas: producto, categoría y categorizaciones (que almacena la relación entre productos y categorías). Estoy tratando de usar atributos anidados para administrar la creación de las categorizaciones, pero no estoy seguro de cómo mi controlador y vista/formulario deben actualizarse para que los nuevos productos también actualicen la tabla de categorizaciones.

Éstos son mis modelos:

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 

Aquí está mi nuevo controlador de producto:

def new 
    @product = Product.new 

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

Y aquí es mi opinión de la forma:

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

¿Cómo debo actualizar mi controlador para que tanto el producto como las tablas de categorización se actualicen cuando se agrega un nuevo producto? ¿Cómo actualizo mi archivo de vista para que las categorías aparezcan en un menú desplegable?

+0

*, pero no están seguros de cómo mi ... La vista/formulario debe actualizarse *. Tampoco tenemos idea ya que no los ha expuesto. – jdoe

+0

Hola @jdoe: agregué el archivo de vista aquí. Solo el estándar creado por los carriles genera comando. –

Respuesta

4

Veo que el producto tiene muchas categorías. Es natural permitir que el usuario los especifique en la creación/edición del producto. Se describe un enfoque here (a través de casillas de verificación para asignar categorías a su producto). Otra forma: crear productos que por lo general y permitir añadir/eliminar categorías en su página de edición, como:

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

también echar un vistazo a Railcasts, como this one por hacerlo en una forma más bella.

0

primer lugar para mostrar categorías en archivo de vista usar algo como siguiente para mostrar la categoría en desplegable

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

Luego, en crear método de controlador de producto hacer algo como siguiente

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

espero que este te ayudaría
Gracias.

0

Tutorial para formulario de modelo anidado de RailsCasts Tal vez lo ayude, o tal vez ayudará a alguien más.

0

Esto es lo que addded a mi archivo de vista del producto, en _form.html - esto creó varias casillas de verificación que podría utilizar para seleccionar varias categorías por producto:

</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 %> 
Cuestiones relacionadas