2012-06-24 13 views
7

Mam posty z nazwą kontrolera. W moim /config/routes.rb, użyłem tego -Ruby na trasie szyny do niestandardowej metody w kontrolerze z widoku

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 

Jestem nowy na szynach i często się mylić z tras. Mam inny kontroler static_pages. W pliku znajduje się plik home.html.erb.

Co chcę zrobić, to zadzwonić -

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

'categoryshow' metodę kontrolera posty z /app/views/static_pages/home.html.erb

Jak zarządzać że? Jeśli użyję "posts_path", przejdzie ona do akcji indeksowej zamiast akcji kategoryzowania.

#

Przeczytałem link i wypróbowałem kilka rzeczy. Tutaj jest problem, że jestem stoi:

Kiedy próbowałem to w config/routes.rb

resources :posts do 

    collection do 

      get 'categoryshow' 

    end 

end 

To generuje 'categoryshow_posts_path'

Moim zdaniem, kiedyś tak:

<ul class="users"> 

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

<li> 

    <%= link_to category,categoryshow_posts_path %> 

</li> 

<% end %> 

</ul> 

Moje posty kontroler ma następującą metodę:

def Kategorie jak

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

koniec

W tym przypadku, ja otrzymuję następujący błąd:

ActiveRecord :: RecordNotFound w PostsController # categoryshow

Nie można znaleźć posta bez identyfikatora


Po drugie, starałem się przy użyciu non trasy zaradny jak wspomniano w tym linku, który podałeś:

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

W widoku używam to:

Kategorie

<ul class="users"> 

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

<li> 

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

</li> 

<% end %> 

</ul> 

W tym przypadku, nasza nierentowna trasa będzie pasować tylko wtedy, gdy żadna inna istniejąca zaradna trasa nie pasuje.Jednak widzę, że akcja show jest dopasowana i otrzymuję komunikat o błędzie:

Jest to akcja pokazowa:

def pokazać

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

koniec

ActiveRecord :: RecordNotFound in PostsController # show

Nie można znaleźć wpisu z id = Polityka

  • Naprawdę doceniam każdą pomoc!

  • Dzięki (Sidharth)

+0

Mam ten sam problem ...:/ Rozwiązałeś problem? – roadev

+0

@roadev \t Ponieważ pytanie pochodziło sprzed czterech lat, z pewnością mam taką nadzieję. –

Odpowiedz

12

Sprawdź "Adding More RESTful Actions" sections of the routing docs.

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

Lub:

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

Sekcja potem omawia dodawanie dowolnych trasach, jeżeli nie spełnia swoich potrzeb.

Należy zauważyć, że plik tras jest jawnie uporządkowany: jeśli spróbujesz dopasować trasę po zdobyciu czegoś innego, wygrywa pierwsza trasa.

+1

Tylko uwaga, jeśli metoda wymaga parametru, jest to "kolekcja", w przeciwnym razie jest to "członek". Drugi sposób wygląda lepiej, ponieważ dodano tylko jedną nową akcję. Użyj bloków, gdy jest 2 lub więcej akcji. Czyż nie? –

+0

@KleberS. Jestem ambiwalentny jeśli chodzi o używanie bloku lub nie; Uważam, że pierwsza wersja jest łatwiejsza do zrozumienia, ponieważ od razu wiadomo, jaki to jest rodzaj trasy. –

+0

Dave, próbowałem tego. Oto, z czym mam do czynienia: –

Powiązane problemy