2012-02-17 29 views
11

Tôi có bộ điều khiển đường ray với hai hành động được xác định: indexshow. Tôi có một biến mẫu được xác định trong hành động index. Mã này là một cái gì đó như dưới đây:Biến thể giống nhau cho tất cả các hành động của bộ điều khiển

def index 
    @some_instance_variable = foo 
end 

def show 
    # some code 
end 

Làm thế nào tôi có thể truy cập vào @some_instance_variable trong show.html.erb mẫu?

Trả lời

10

Trừ khi bạn đang hiển thị show.html.erb từ hành động index, bạn cũng sẽ cần đặt @some_instance_variable trong hành động hiển thị. Khi một hành động điều khiển được gọi, nó gọi phương thức khớp - do đó nội dung của phương thức index của bạn sẽ không được gọi khi sử dụng hành động show.

Nếu bạn cần @some_instance_variable thiết lập để điều tương tự trong cả các hành động indexshow, cách chính xác sẽ được xác định một phương pháp khác, được gọi là bởi cả hai indexshow, mà bộ biến ví dụ.

def index 
    set_up_instance_variable 
end 

def show 
    set_up_instance_variable 
end 

private 

def set_up_instance_variable 
    @some_instance_variable = foo 
end 

Lập set_up_instance_variable phương pháp tư nhân ngăn cản nó được gọi là một hành động điều khiển nếu bạn có các tuyến đường tự đại diện (ví dụ: match ':controller(/:action(/:id(.:format)))')

+1

Cảm ơn @Emily. Nhưng có cách nào để làm điều này? – Red

+0

Cảm ơn @Emily tôi đang tìm kiếm tương tự. Chúc mừng! – Aashish

+0

Chỉ cần thêm 'before_action: set_up_instance_variable, chỉ: [: show,: index]' vào bộ điều khiển. Điều đó sẽ chạy 'set_up_instance_variable' trước bất kỳ hành động nào bạn chỉ định. – domi91c

52

Bạn có thể định nghĩa các biến dụ cho nhiều hành động bằng cách sử dụng một bộ lọc trước, ví dụ .:

class FooController < ApplicationController 
    before_filter :common_content, :only => [:index, :show] 

    def common_content 
    @some_instance_variable = :foo 
    end 
end 

Bây giờ @some_instance_variable sẽ có thể truy cập từ tất cả các mẫu (bao gồm partials) render từ index hoặc show hành động.

+4

Đây là một câu trả lời tốt hơn! –

+0

Rất DRY. Tốt đẹp! – Red

+0

@Mori Làm thế nào bạn sẽ đi về việc quyết định có nên đặt các phương pháp/đối tượng trong không gian tư nhân hoặc bảo vệ hoặc công cộng? Thks! – Red

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