Problema al crear un nuevo def


#1

Hola gente, les comento como viene la mano, primero hice un scaffold y
obtuve un controller al cual le agrege el siguiente def:
def listar
@productos = Producto.find(:all)

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @productos }
end

end

osea viene a ser una nueva forma de listar los productos, quedandome el
controller como:

class ProductosController < ApplicationController

GET /productos

GET /productos.xml

def index
@productos = Producto.find(:all)

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @productos }
end

end

GET /productos/1

GET /productos/1.xml

def show
@producto = Producto.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.xml  { render :xml => @producto }
end

end

GET /productos/new

GET /productos/new.xml

def new
@producto = Producto.new
@categoria = Categoria.find(:all)
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @producto }
end
end

GET /productos/1/edit

def edit
@producto = Producto.find(params[:id])
@categoria = Categoria.find(:all)
end

POST /productos

POST /productos.xml

def create
@producto = Producto.new(params[:producto])

respond_to do |format|
  if @producto.save
    flash[:notice] = 'Producto was successfully created.'
    format.html { redirect_to(@producto) }
    format.xml  { render :xml => @producto, :status => :created,

:location => @producto }
else
format.html { render :action => “new” }
format.xml { render :xml => @producto.errors, :status =>
:unprocessable_entity }
end
end
end

PUT /productos/1

PUT /productos/1.xml

def update
@producto = Producto.find(params[:id])

respond_to do |format|
  if @producto.update_attributes(params[:producto])
    flash[:notice] = 'Producto was successfully updated.'
    format.html { redirect_to(@producto) }
    format.xml  { head :ok }
  else
    format.html { render :action => "edit" }
    format.xml  { render :xml => @producto.errors, :status =>

:unprocessable_entity }
end
end
end

DELETE /productos/1

DELETE /productos/1.xml

def destroy
@producto = Producto.find(params[:id])
@producto.destroy

respond_to do |format|
  format.html { redirect_to(productos_url) }
  format.xml  { head :ok }
end

end

def listar
@productos = Producto.find(:all)

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @productos }
end

end
end

Ahora, cuando intento acceder a la accion listar del controller
productos mediante la url:http://localhost:3000/productos/listar, me
aparece el siguiente error:

ActiveRecord::RecordNotFound in ProductosController#show

Couldn’t find Producto with ID=listar

Como si intentara llamar a la accion “show” con parametro “listar”, en
vez de llamar directamente a la accion “listar”. Espero que alguien
pueda darme una ayuda. Desde ya muchas gracias. Saludos.


#2

Hernán Pérez
escribió:> Ahora, cuando intento acceder a la accion listar del controller

productos mediante la url:http://localhost:3000/productos/listar, me
aparece el siguiente error:

ActiveRecord::RecordNotFound in ProductosController#show

Couldn’t find Producto with ID=listar

Como si intentara llamar a la accion “show” con parametro “listar”, en
vez de llamar directamente a la accion “listar”.

Eso es precisamente lo que esta pasando. Se debe a que en tu routes la
linea

map.resources :productos

esta antes de

map.connect ‘:controller/:action/:id’

con lo que al analizarse las rutas cae primero en el show de productos.

Una solucion?
Puedes crearte una named routes antes del resource
map.mi_listado_guapo ‘productos/listar’, :controller => ‘productos’,
:action => ‘listar’
map.resources :productos


#3

El Monday 24 November 2008 13:11:56 cartuchoGL
escribió:>

Una solucion?
Puedes crearte una named routes antes del resource
map.mi_listado_guapo ‘productos/listar’, :controller => ‘productos’,

:action => ‘listar’

map.resources :productos

Yo lo añadiría al resources con :collection
map.resources :productos, :collection => {:listar => :get}


Sergio Cambra .:: entreCables - Symbol Servicios Informáticos S.L. ::.
Nicolás Guillén 6, locales 2 y 3. 50.018 Zaragoza
T) 902 021 404 F) 976 52 98 07 E) removed_email_address@domain.invalid


#4

cartuchoGL wrote:

Una solucion?
Puedes crearte una named routes antes del resource
map.mi_listado_guapo ‘productos/listar’, :controller => ‘productos’,
:action => ‘listar’
map.resources :productos

Tienes razón, muchas gracias por la solución. Saludos.


#5

Sergio Cambra .:: entreCables - Symbol Servicios
wrote:

Yo lo a�adir�a al resources con :collection
map.resources :productos, :collection => {:listar => :get}

Esta buena esa forma, creo q es mas limpio el codigo. Saludos.