2012-06-24 18 views
7

Tengo un nombre de controlador de mensajes. En mi /config/routes.rb, he utilizado este -Ruta de Ruby on rails a un método personalizado en el controlador desde la vista

resources :posts 

/app/controllers/posts_controller.rb:

class PostsController < ApplicationController 
    def new 
      @post = Post.new 
    end 

    def show 
      @post = Post.find(params[:id]) 
    end 

    def categoryshow 
      @post = Post.find(params[:category]) 
    end 

    def index 
      @posts = Post.all 
    end 

    def create 
      @post = Post.new(params[:post]) 
      if @post.save 
        flash.now[:success] = "Your Post Successful" 
        redirect_to @post 
      else 
        render 'new' 
      end 
    end 
end 

Soy nuevo a los rieles y yo a menudo se confunden con las rutas. Tengo otro controlador static_pages. En hay un archivo home.html.erb.

Lo que quiero hacer es llamar -

método
def categoryshow 
      @post = Post.find(params[:category]) 
end 

'categoryshow' del controlador de mensajes de /app/views/static_pages/home.html.erb

¿Cómo administro eso? Si uso 'posts_path', va a indexar acción en lugar de acción categoryshow.

#

Lo leí a través del enlace e intenté un par de cosas a partir de ahí. Aquí está el problema que estoy enfrentando:

Cuando probé esto en el config/routes.rb

resources :posts do 

    collection do 

      get 'categoryshow' 

    end 

end 

Esto genera un 'categoryshow_posts_path'

En mi opinión, he usado esto:

<ul class="users"> 

    <%= Post::CATEGORIES.each do |category| %> 

<li> 

    <%= link_to category,categoryshow_posts_path %> 

</li> 

<% end %> 

</ul> 

Mi controlador de mensajes tiene el siguiente método:

categorías def cómo

 @post = Post.find(params[:category]) 

final

En este caso, estoy consiguiendo el error siguiente:

ActiveRecord :: RecordNotFound en PostsController # categoryshow

no se pudo encontrar el mensaje sin un ID


En segundo lugar, he probado usando rutas no inventivos como se menciona en ese enlace que ya ha proporcionado:

match ':posts(/:categoryshow(/:category))' 

En la vista, estoy usando esto:

Categorías

<ul class="users"> 

<%= Post::CATEGORIES.each do |category| %> 

<li> 

    <%= link_to category,"posts/#{category}" %> 

</li> 

<% end %> 

</ul> 

En este caso, nuestra ruta sin recursos solo coincidirá si ninguna otra ruta de recursos existente coincide.Sin embargo, estoy viendo ese programa de acción se corresponde y me sale este mensaje de error:

Este es el show de acción:

def mostrar

 @post = Post.find(params[:id]) 

final

ActiveRecord :: RecordNotFound en PostsController # show

No se pudo encontrar la publicación con id = Politics

  • Realmente agradecería cualquier ayuda aquí !!

  • Gracias (Sidharth)

+0

Tengo el mismo problema ...:/ ¿Lo resolvió? – roadev

+0

@roadev \t Dado que la pregunta era de hace cuatro años, ciertamente espero que sí. –

Respuesta

12

puedes ver los "Adding More RESTful Actions" sections of the routing docs.

resources :posts do 
  collection do 
    get 'categoryshow' 
  end 
end 

O:

resources :posts do 
    get 'categoryshow', :on => :collection 
end 

La sección después de la que se explica cómo agregar rutas arbitrarias si eso no se ajusta a sus necesidades exactas.

Tenga en cuenta que el archivo de rutas se ordena explícitamente: si intenta hacer coincidir una ruta después de que otra persona lo haya capturado, la primera ruta gana.

+1

Solo una nota, si el método requiere un parámetro, es una 'colección', de lo contrario, es un' miembro'. Y la segunda forma se ve mejor, ya que solo se agrega una nueva acción. Usa bloques cuando hay 2 o más acciones. ¿No es así? –

+0

@KleberS. Soy ambivalente con respecto al uso de un bloqueo o no; Encuentro que la primera versión es más fácil de razonar porque es obvio de inmediato qué tipo de ruta es. –

+0

Dave, probé esto. Este es el problema que estoy enfrentando: –

Cuestiones relacionadas