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.

¿Fue útil?

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}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top