2010-11-08 21 views
5

Tôi đã tạo một tuyến đường lồng nhau trong dự án Ruby on Rails 3. với định tuyến sau:Cho biết bộ điều khiển đang được sử dụng trong một tuyến đường lồng nhau trong Rails 3

resources :companies do 
    resources :projects 
end 

bây giờ tôi có thể nhận được phương pháp chỉ số contoller dự án qua example.com/projects/id hoặc example.com/companies/id/projects/id, nhưng cả hai trang hiển thị chính xác trong cùng một cách. Làm thế nào tôi có thể thay đổi trang dự án trong ví dụ thứ hai để chỉ hiển thị các dự án được liên kết với công ty đó?

Trả lời

10

Tôi sẽ thay đổi cách bạn điều chỉnh phạm vi tìm. Rails 3 là đẹp cho phép bạn làm điều này bởi vì chỉ là về tất cả mọi thứ là scope'able.

Thứ nhất trong điều khiển của bạn tôi sẽ tìm thấy tài nguyên cha mẹ sử dụng một cái gì đó như thế này:

before_filter :find_company 

# your actions go here 

private 

    def find_company 
    @company = Company.find(params[:company_id]) if params[:company_id] 
    end 

này nên được khá thẳng về phía trước: Tìm một kỷ lục Company có một ID mà phù hợp với một trôi qua từ lồng nhau tuyến đường. Nếu nó không được lồng vào nhau, thì sẽ không có params[:company_id] do đó sẽ không có bộ biến số @company.

Tiếp theo, bạn muốn tìm phạm vi dự án, tùy thuộc vào việc có hay không @company được đặt. Điều này cũng dễ dàng. Ngay dưới before_filter đầu tiên, đặt cái này:

before_filter :scope_projects 

Sau đó xác định phương pháp cho nó bên dưới phương pháp find_company như thế này:

def scope_projects 
    @projects = @company ? @company.projects : Project 
end 

Bây giờ có lẽ bạn đang nghĩ "Woah". Tôi biết. Tôi cũng vậy.

Bây giờ, bất cứ nơi nào bạn tham chiếu hoặc là hiệp hội projects hoặc lớp Project, hãy sử dụng @projects để thay thế. Bằng sức mạnh của phương pháp scope_projects này, ứng dụng của bạn sẽ biết liệu bạn có nghĩa là "tất cả các dự án, bao giờ" hoặc "tất cả các dự án, từng có trong công ty được chỉ định" hay không.

Bây giờ khi bạn nhận được để các quan điểm, bạn có thể làm một cái gì đó như thế này:

<h1><% if @company %><%= @company.name %>'s<% end %> Projects</h1> 

Bạn thậm chí có thể di chuyển nó vào một helper:

def optional_company 
    if @company 
    @company.name + "'s" 
    end 
end 

Và lần lượt là xấu xí hunk-o- logic vào đây:

<h1><%= optional_company %> Projects</h1> 

Sửa đổi theo yêu cầu.

Hy vọng điều này hữu ích.

+0

Cảm ơn! hoạt động như một sự quyến rũ. – GSto

1

Với sức mạnh của inherited_resources bạn có thể có tổ tùy chọn với bộ điều khiển sau:

class ProjectsController < InheritedResources::Base 
    belongs_to :company, :optional => true 
end 
Các vấn đề liên quan