2012-04-17 29 views
10

tôi đã xác định phương pháp trong ApplicationControllerLàm thế nào để gọi các phương thức quy định tại ApplicationController trong các mô hình

class ApplicationController < ActionController::Base 
    helper_method :get_active_gateway 
    def get_active_gateway(cart) 
    cart.account.gateways 
    end 
end 

Khi tôi gọi phương pháp này trong mô hình

class Order < ActiveRecord::Base 
    def transfer 
    active= get_active_gateway(self.cart) 
    end 
end 

Nó ném lỗi undefined local variable get_active_gateway.

Vì vậy, tôi đã viết

class Order < ActiveRecord::Base 
    def transfer 
    active= ApplicationContoller.helpers.get_active_gateway(self.cart) 
    end 
end 

Sau đó, nó đã được ném error undefined method nil for Nilclass.

Tôi đang làm việc trong Rails 3.2.0.

+2

Khi hai câu trả lời cho biết, bạn không nên gọi các phương thức điều khiển từ mô hình của mình. Nó không được khuyến khích. Đọc vào Bộ điều khiển xem mô hình (MVC). Để giữ cho mọi thứ độc lập. Về cơ bản Mô hình đàm phán để lưu trữ, các cuộc đàm phán điều khiển để mô hình (không phải là cách khác xung quanh), và xem các cuộc đàm phán để điều khiển. –

+0

Do thiết kế Rails, và loại bỏ khả năng gọi ApplicationController.helpers (bây giờ), bạn phải 'lặp lại chính mình' với một def-code def trong mô hình. Hãy chắc chắn để thêm một bình luận ở cả hai nơi vì vậy nếu bạn thay đổi nó ở một nơi, bạn nhớ để đi và thay đổi nó trong khác. – JosephK

Trả lời

6

Tại sao bạn cần những thứ như vậy? Mô hình không nên biết về bộ điều khiển của nó. Có thể thiết kế lại hệ thống của bạn sẽ phù hợp hơn trong trường hợp này.

Đây là liên kết tương tự thread.

5

Là một lựa chọn thiết kế, không nên chọn trình trợ giúp điều khiển cuộc gọi từ các mô hình của bạn.

Bạn chỉ cần chuyển các chi tiết được yêu cầu đến phương thức mô hình của mình làm đối số.

 

def transfer(active_gateway) 
    active = active_gateway 
end 
Các vấn đề liên quan