Agregar una acción a un controlador existente (Ruby on Rails)
-
03-07-2019 - |
Pregunta
Soy nuevo en Ruby on Rails, he completado el Tutorial de blog .
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 contiene nada más que html simple.
Cuando voy a / posts / start me aparece 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 ID válida. ¿Por qué no se ejecuta la acción de inicio? ¿Hay alguna parte de la arquitectura o configuración de MVC que me falta?
A continuación se encuentra 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 probé con Mongrel y webrick.
Solución
Su enrutamiento no está configurado para permitir esa ruta. Suponiendo que esté utilizando el andamio predeterminado, coloque esta línea antes de la línea map.resources: posts
en config / route.rb:
map.connect "posts/:action", :controller => 'posts', :action => /[a-z]+/i
La expresión regular para : acción
lo restringe a solo a-z (para evitar la captura de cosas como / posts / 1). Se puede mejorar si necesita guiones bajos o números en sus nuevas acciones.
Otros consejos
El error que estás cometiendo es en realidad bastante común.
Básicamente, Rails asigna automáticamente las direcciones URL de sus andamios. Así que cuando creó los andamios de publicaciones, Rails está mapeando las rutas URL para ellos. Una de esas rutas es la URL para ver una sola publicación: / posts / (post_id)
Entonces, cuando ingresas la URL / publicaciones / inicio, Rails cree que estás diciendo " Oye, dame la publicación con ID = inicio. Así que Rails se queja de que el método show no puede encontrar una publicación con tal ID.
Una forma rápida de solucionar este problema es asegurarse de que config / route.rb tenga la ruta para la acción de inicio antes de las rutas de andamios:
# 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.
En el 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'
solucionó mi problema.
Intente esto si está utilizando rieles 3.0.3
en tu ruta.rb
resource :posts do
collection do
get 'start'
end
end
esto podría ayudar
Quiero decir, a veces Rails se atasca con el almacenamiento en caché de rutas, incluso en el entorno de desarrollo .
Puede ayudar a reiniciar su servidor Rails . Esto me ha funcionado más veces de las que puedo contar al recibir este error.
Esto funciona:
map.resource :post, :collection => { :my_action => :get}
Encontré la solución a mi problema, en el archivo route.rb donde
map.resource :post
Agregué con el argumento de la colección, por lo que se mantuvo así:
map.resource :post, :collection => { :my_action => :get}