Forum: Rails-ES Problema al crear un nuevo def

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Hernán P. (Guest)
on 2008-11-23 01:35
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.
cartuchoGL (Guest)
on 2008-11-24 14:12
(Received via mailing list)
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
Hernán P. (Guest)
on 2008-11-24 14:23
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.
Sergio Cambra .:: entreCables - Symbol Servicios (Guest)
on 2008-11-24 14:48
(Received via mailing list)
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
Hernán P. (Guest)
on 2008-11-24 15:14
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.
This topic is locked and can not be replied to.