2012-06-24 9 views
7

Ho un nome di controller post. Nel mio /config/routes.rb, ho usato questo -Ruby on rails indirizza a un metodo personalizzato nel controller dalla 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 

Sono nuovo di rotaie e spesso si confondono con gli itinerari. Ho un altro controller static_pages. In c'è un file home.html.erb.

Quello che voglio fare è chiamare -

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

'Categorievisualizza' il metodo di controllo post di /app/views/static_pages/home.html.erb

Come faccio a gestire questo? Se uso "posts_path", va all'azione indice invece di categorizzare l'azione.

#

Ho letto il collegamento e ho provato un paio di cose da lì. Qui è il problema che sto affrontando:

Quando ho provato questo nella cartella config/routes.rb

resources :posts do 

    collection do 

      get 'categoryshow' 

    end 

end 

Questo genera un 'categoryshow_posts_path'

A mio parere, ho usato questo:

<ul class="users"> 

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

<li> 

    <%= link_to category,categoryshow_posts_path %> 

</li> 

<% end %> 

</ul> 

mio regolatore di messaggi ha il seguente metodo:

categorys def come

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

fine

In questo caso, sto ottenendo il seguente errore:

ActiveRecord :: RecordNotFound in PostsController # Categorievisualizza

Impossibile trovare Post senza un ID


In secondo luogo, ho provato utilizzando percorsi non di risorse di cui al quel link che hai fornito:

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

Nella vista, sto usando questo:

Categorie

<ul class="users"> 

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

<li> 

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

</li> 

<% end %> 

</ul> 

In questo caso, il nostro percorso non intraprendente corrisponderà solo se nessun altro itinerario di risorse esistente corrisponde.Tuttavia, sto vedendo che mostrano l'azione è abbinato e ricevo questo messaggio di errore:

Questa è l'azione spettacolo:

mostrare def

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

fine

ActiveRecord :: RecordNotFound in PostsController # show

Impossibile trovare Post con id = Politica

  • Apprezzerei molto qualsiasi aiuto qui !!

  • Grazie (Sidharth)

+0

Ho lo stesso problema ...:/ Hai risolto? – roadev

+0

@roadev \t Poiché la domanda era di quattro anni fa, certamente lo spero. –

risposta

12

Scopri la "Adding More RESTful Actions" sections of the routing docs.

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

Oppure:

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

La sezione dopo che discute l'aggiunta di percorsi arbitrari se questo non soddisfa le vostre esigenze.

Si noti che il file di rotte è ordinato esplicitamente: se si tenta di abbinare un percorso dopo che altri lo avrebbero catturato, il primo percorso vince.

+1

Solo una nota, se il metodo richiede un parametro, è una 'collezione', altrimenti è un' membro'. E il secondo aspetto appare migliore poiché è stata aggiunta solo una nuova azione. Usa i blocchi quando ci sono 2 o più azioni. Non è vero? –

+0

@KleberS. Sono ambiguo riguardo all'uso di un blocco o meno; Trovo la prima versione più facile da ragionare perché è immediatamente evidente quale sia il tipo di percorso. –

+0

Dave, ci ho provato. Ecco quale problema sto affrontando: –

Problemi correlati