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