tutorial rails learn create crear beginner ruby-on-rails model ruby-on-rails-3.2 categories

ruby on rails - rails - categorías y subcategorías modelo rieles



ruby on rails pdf (1)

Sin usar ninguna gema, ¿cómo hago esto en los rieles?

categoria principal
Subcategoría
Subcategoría
Subcategoría

categoria principal
Subcategoría
Subcategoría
Subcategoría

categoria principal
Subcategoría
Subcategoría
Subcategoría

Tengo una mesa que consta de | id | nivel1 | nivel2 |

Nivel 1 siendo la categoría principal y Nivel 2 siendo la subcategoría

Me gustaría que se muestre en la vista como arriba.

Después de mirar en internet, todo el mundo parece recomendar el uso de actos como la gema del árbol, pero quiero evitar usarlos porque soy bastante nuevo en los rieles y me gustaría entender cómo hacer las cosas en lugar de recurrir a las gemas .

Su ayuda es muy apreciada.

Modelo:

class Category < ActiveRecord::Base belongs_to :catalogue has_many :subcategories, :class_name => "Category", :foreign_key => "parent_id", :dependent => :destroy belongs_to :parent_category, :class_name => "Category" end

Controlador:

class CataloguesController < ApplicationController layout ''main'' def index @cats = Catalogue.all end def categories @cat = Catalogue.find(params[:id]) end end

Ver:

<ul class="unstyled-list"> <% @cat.categories.order([:level1]).each do |cat|%> <li><%= cat.level1 %></li> <li><%= cat.level2 %></li> <% end %> </ul>


Cree un modelo que tenga referencias a sí mismo para una subcategoría (o una subcategoría, etc.):

class Category < ActiveRecord::Base has_many :subcategories, :class_name => "Category", :foreign_key => "parent_id", :dependent => :destroy belongs_to :parent_category, :class_name => "Category" end

  • has_many define una asociación de subcategories de la Category tipo de modelo. Es decir, utiliza la misma tabla.
  • El belongs_to define una relación con la categoría principal (opcional, no es obligatorio)

Para obtener más información sobre asociaciones de modelos, has_many o belongs_to , lea la Guía de belongs_to básicos de asociaciones .

Para crear la tabla usa esta migración:

class CreateCategories < ActiveRecord::Migration def self.up create_table :category do |t| t.string :text t.references :parent t.timestamps end end end

Nota : este formato de tabla es (ligeramente) diferente al que propuso, pero supongo que no es un problema real.

La Guía de Migraciones contiene más información sobre las migraciones de base de datos.

En tu controlador usa

def index @category = nil @categories = Category.find(:all, :conditions => {:parent_id => nil } ) end

para encontrar todas las categorías sin un padre, es decir, las categorías principales

Para encontrar todas las subcategorías de cualquier categoría dada use:

# Show subcategory def show # Find the category belonging to the given id @category = Category.find(params[:id]) # Grab all sub-categories @categories = @category.subcategories # We want to reuse the index renderer: render :action => :index end

Para agregar una nueva categoría usa:

def new @category = Category.new @category.parent = Category.find(params[:id]) unless params[:id].nil? end

Crea una nueva categoría y establece el padre, si se proporciona (de lo contrario, se convierte en una categoría principal)

Nota: usé la antigua sintaxis de los rieles (debido a la pereza), pero para Rails 3.2 el principio es el mismo.

En tus categories/index.html.erb puedes usar algo como esto:

<h1><%= @category.nil? ? ''Main categories'' : category.text %></h1> <table> <% @categories.each do |category| %> <tr> <td><%= link_to category.text, category_path(category) %></td> <td><%= link_to ''Edit'', edit_category_path(category) unless category.parent.nil? %></td> <td><%= link_to ''Destroy'', category_path(category), :confirm => ''Are you sure?'', :method => :delete unless category.parent.nil? %></td> </tr> <% end %> </table> <p> <%= link_to ''Back'', @category.parent.nil? ? categories_path : category_path(@category.parent) unless @category.nil? %> <%= link_to ''New (sub-category'', new_category_path(@category) unless @category.nil? %> </p>

Muestra el nombre de la categoría seleccionada (o Categoría principal) y todas sus subcategorías (en una tabla agradable). Enlaza a todas las subcategorías, mostrando un diseño similar, pero para la subcategoría. Al final, agrega un enlace ''nueva subcategoría'' y un enlace ''atrás''.

Nota : Mi respuesta se volvió un poco extensa ... Lo copié y modifiqué de uno de mis proyectos que utiliza una construcción similar (para (sub) menús). Así que espero no haber roto nada durante las modificaciones ... :)