2012-01-09 27 views
5

tôi đang tạo ứng dụng thương mại điện tử trong đó các danh mục hiển thị trong thanh bên trên tất cả các trang. tôi đã viết một phương pháp trong điều khiển ứng dụngTôi muốn tạo phương thức sẽ có sẵn trong tất cả các bộ điều khiển và xem

def categories 
    @categories = Category.all 
end 

nhưng làm thế nào tôi có thể làm cho phương pháp này dành cho tất cả các bộ điều khiển và hành động theo mặc định để tôi không phải đặc biệt gọi phương pháp này trong mọi hành động

def list 
    categories 
    @products = Product.order('title').page(params[:page]).per(4) 
end 
+0

xác định phương thức đó trong application_controller và sau khi định nghĩa bộ điều khiển ứng dụng thêm 'helper_method: categories' (cái bạn muốn gọi là' helper_method') – cristian

Trả lời

10

Bạn có thể định nghĩa phương thức của bạn trong application_controller.rb và vì mọi bộ điều khiển khác kế thừa từ phương thức này, phương thức đó sẽ có sẵn cho tất cả các bộ điều khiển. Ngoài ra, để làm cho nó trở thành một phương pháp trợ giúp cho nó có sẵn trong các khung nhìn, bạn có thể nói helper_method :my_method trong application_controller.rb.

Bây giờ, để được đánh giá tự động trước bất kỳ hành động nào khác trong bộ điều khiển, bạn có thể sử dụng before_filter. Thêm before_filter :my_method trong bộ điều khiển bạn muốn phương pháp này để được đánh giá trước bất kỳ hành động hoặc trong application_controller.rb

0

Nếu bạn muốn một cái gì đó mà có được trên toàn bộ ứng dụng, như trong trường hợp này: @categories , sau đó viết helper.

trong app/helpers/application_helper.rb

module ApplicationHelper 
    def get_all_categories 
    @categories = Category.all 
    end 
end 
-2

Tôi không điều rằng có một cách để chạy toàn cầu này. Bạn có thể chạy nó trong một before_filter vì vậy nó được gọi trước mỗi hành động nhưng bạn phải xác định điều này trong mọi bộ điều khiển một lần nữa!

Đề nghị của tôi sẽ được đặt những thứ loại thanh bên trong một phần, trong đó có một cuộc gọi như thế này:

<% Category.all.each do |category| %> 
    <% do stuff to display all categories %> 
<% end %> 

Sau đó, bạn chỉ đơn giản là có thể thêm render cuộc gọi đến layout/application.html.erb của bạn mà sẽ làm điều đó cho bạn!

+1

'Bạn có thể chạy nó trước một before_filter. bạn phải xác định điều này trong mọi bộ điều khiển một lần nữa' ... Nếu bạn đặt 'before_filter' trong ApplicationController, bạn không phải chỉ định lại nó trong mọi hành động điều khiển (do mặc định chúng kế thừa các bộ lọc). Ngoài ra, bạn đang thực hiện các cuộc gọi mô hình trong các chế độ xem không bao giờ là điều tốt. Đi dễ dàng trên ném từ f xung quanh. – iwasrobbed

+0

Nó không phải là một vấn đề để làm một cuộc gọi 'all' trong xem nó okay để gọi phương pháp trên mô hình miễn là không có logic trong nó thuộc về' mô hình' hoặc 'điều khiển'. – davidb

+0

Tôi nghĩ rằng một cái gì đó như thế này chắc chắn thuộc về xem, có thể trong một người trợ giúp. Tôi muốn thêm <% cache ('sidebar_categories') làm%> xung quanh nó và có một bản cập nhật cho một thể loại sidebar làm mất hiệu lực điều này. – sunkencity