2012-06-24 43 views
7

Tôi có một bài đăng tên bộ điều khiển. Trong /config/routes.rb của tôi, tôi đã sử dụng này -Tuyến đường Ruby trên đường ray đến phương thức tùy chỉnh trong bộ điều khiển từ màn hình

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 

Tôi mới vào đường ray và tôi thường bị lẫn lộn với các tuyến đường. Tôi có một bộ điều khiển static_pages khác. Trong đó có một tập tin home.html.erb.

phương pháp
def categoryshow 
      @post = Post.find(params[:category]) 
end 

'categoryshow' của bài viết khiển từ /app/views/static_pages/home.html.erb

Làm thế nào để quản lý đó -

Những gì tôi muốn làm gì để gọi là? Nếu tôi sử dụng 'posts_path', nó sẽ hoạt động chỉ mục thay vì hành động categoryshow.

#

Tôi đọc qua liên kết và thử một vài thứ từ đó. Đây là vấn đề mà tôi đang phải đối mặt:

Khi tôi cố này trong config/routes.rb

resources :posts do 

    collection do 

      get 'categoryshow' 

    end 

end 

này tạo ra một 'categoryshow_posts_path'

Theo quan điểm của tôi, tôi đã sử dụng này:

<ul class="users"> 

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

<li> 

    <%= link_to category,categoryshow_posts_path %> 

</li> 

<% end %> 

</ul> 

điều khiển bài viết của tôi có các phương pháp sau đây:

def chuyên cung cách

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

cuối

Trong trường hợp này, tôi nhận được lỗi sau:

ActiveRecord :: RecordNotFound trong PostsController # categoryshow

không thể tìm thấy bài viết mà không cần một ID


Thứ hai, tôi đã cố gắng bằng cách sử dụng các tuyến đường không tháo vát như đã đề cập trong liên kết mà bạn cung cấp:

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

Trong giao diện, tôi đang sử dụng này:

Categories

<ul class="users"> 

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

<li> 

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

</li> 

<% end %> 

</ul> 

Trong trường hợp này, tuyến đường không có tài nguyên của chúng tôi sẽ chỉ khớp với nhau nếu không có các tuyến đường có sẵn khác.Tuy nhiên, tôi đang thấy rằng chương trình hành động phù hợp và tôi nhận được thông báo lỗi này:

Đây là hành động cho thấy:

def hiển thị

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

cuối

ActiveRecord :: RecordNotFound trong PostsController # show

Không thể tìm thấy Bài đăng có id = Chính trị

  • Tôi thực sự đánh giá cao sự trợ giúp ở đây !!

  • Cảm ơn (Sidharth)

+0

Tôi có cùng sự cố ...:/ Bạn đã giải quyết nó chưa? – roadev

+0

@roadev \t Vì câu hỏi là từ bốn năm trước, tôi chắc chắn hy vọng như vậy. –

Trả lời

12

Kiểm tra các "Adding More RESTful Actions" sections of the routing docs.

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

Hoặc:

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

Phần sau đó thảo luận thêm đường tùy ý nếu không đáp ứng nhu cầu chính xác của bạn.

Lưu ý rằng các tệp tuyến đường được sắp xếp rõ ràng: nếu bạn cố gắng khớp một tuyến đường sau khi có thứ gì đó khác đã chiếm được, tuyến đường đầu tiên sẽ thắng.

+1

Chỉ cần một lưu ý, nếu phương thức yêu cầu tham số, nó là một 'bộ sưu tập', nếu không, nó là một' thành viên'. Và cách thứ hai có vẻ tốt hơn vì chỉ có một hành động mới được thêm vào. Sử dụng các khối khi có từ 2 hành động trở lên. Phải không? –

+0

@KleberS. Tôi có tham vọng về việc sử dụng một khối hay không; Tôi tìm thấy phiên bản đầu tiên dễ dàng hơn vì lý do vì nó ngay lập tức rõ ràng loại tuyến đường đó là gì. –

+0

Dave, tôi đã thử điều này. Đây là vấn đề tôi đang gặp phải: –

Các vấn đề liên quan