ror rails examples ruby-on-rails ruby rails-routing

examples - Agregar una acción a un controlador existente(Ruby on Rails)



routes rails examples (7)

El error que estás cometiendo es realmente bastante común.

Básicamente, Rails mapea automáticamente las URL de sus andamios. Por eso, cuando creaste los andamios de Publicaciones, Rails está mapeando las rutas URL para ello. Una de esas rutas es la URL para ver una sola publicación: / posts / (post_id)

Entonces, cuando ingresas la URL / posts / start, Rails piensa que dices "Hey, dame la publicación con ID = start. Entonces Rails se queja de que el método de show no puede encontrar una publicación con dicha ID.

Una manera rápida de arreglar esto es asegurarse de que config / routes.rb tenga la ruta para la acción de inicio antes de las rutas del andamio:

# Route for start action map.connect ''/posts/start'', :controller => ''posts'', :action => ''start'' # Default mapping of routes for the scaffold map.resources :posts

De todos modos, espero que ayude.

Soy nuevo en Ruby on Rails, he completado el Blog Tutorial .

Ahora estoy tratando de agregar una acción adicional al controlador, llamada ''inicio''.

def start end

He agregado una página de vista "app / views / posts / start.html.erb" que no contiene nada más que html simple.

Cuando voy a / posts / start obtengo el siguiente error.

ActiveRecord::RecordNotFound in PostsController#show Couldn''t find Post with ID=start

Entiendo el error, la acción de mostrar se está ejecutando y el inicio no es una identificación válida. ¿Por qué no se ejecuta la acción de inicio? ¿Me falta alguna parte de la arquitectura o configuración de MVC?

A continuación está mi posts_controller.rb

class PostsController < ApplicationController # GET /posts/start def start end # GET /posts # GET /posts.xml def index @posts = Post.find(:all) respond_to do |format| format.html # index.html.erb format.xml { render :xml => @posts } end end # GET /posts/1 # GET /posts/1.xml def show @post = Post.find(params[:id]) respond_to do |format| format.html # show.html.erb format.xml { render :xml => @post } end end end

Sí, reinicié el servidor y lo intenté con Mongrel y webrick.


Su enrutamiento no está configurado para permitir esa ruta. Suponiendo que está utilizando el andamiaje predeterminado, coloque esta línea antes del map.resources :posts line en config / routes.rb:

map.connect "posts/:action", :controller => ''posts'', :action => /[a-z]+/i

La expresión regular para :action restringe a simplemente az (para evitar detectar cosas como / posts / 1). Se puede mejorar si necesita subrayados o números en sus nuevas acciones.


Encontré la solución a mi problema, en el archivo routes.rb donde

map.resource :post

Agregué el argumento de recolección, así que se mantuvo así:

map.resource :post, :collection => { :my_action => :get}


Quiero decir que a veces Rails se vuelve pegajoso con el almacenamiento en caché de rutas, incluso en el entorno de desarrollo .

Puede ser útil reiniciar su servidor Rails . Esto me ha funcionado más veces de las que puedo contar al recibir este error.


Intenta esto si estás usando rieles 3.0.3

en tu ruta.rb

resource :posts do collection do get ''start'' end end

esto podría ayudar


Esto funciona:

map.resource :post, :collection => { :my_action => :get}


Uso de Rails 4.x:

get ''/posts/start'', :controller => ''posts'', :action => ''start''

En el uso de Rails 3.x:

match ''/posts/start'', :controller => ''posts'', :action => ''start''

en lugar de

map.connect ''/posts/start'', :controller => ''posts'', :action => ''start''

resolvió mi problema