2015-03-19 12 views
5

Có nơi thích hợp cho các phương thức trợ giúp cho các mô hình trong Rails không? Có các phương thức trợ giúp cho các bộ điều khiển và khung nhìn, nhưng tôi không chắc nơi nào là nơi tốt nhất để đặt các phương thức trợ giúp mô hình. Ngoài việc thêm phương thức vào ActiveRecord::Base, tôi không muốn.Các phương thức trợ giúp cho các mô hình trong Rails

CẬP NHẬT: Có vẻ như Mối quan tâm rất có ý nghĩa. Đây là một ví dụ về những gì tôi muốn. Một số mô hình nhất định không bao giờ có thể bị xóa, vì vậy tôi thêm một cuộc gọi lại luôn ném một ngoại lệ:

before_destroy :nope 
def nope 
    raise 'Deleting not allowed' 
end 

Với những lo ngại, tôi có thể làm điều gì đó như thế này?

class MyModel < ActiveRecord::Base 
    include Undeletable 
end 

module Undeletable 
    extend ActiveSupport::Concern 

    included do 
     before_destroy :nope 
    end 

    def nope 
     raise 'Deleting not allowed' 
    end 
end 

Đây có phải là cách Rails thực hiện việc này không?

+3

Tại sao bạn không sử dụng mô-đun Ruby cũ đơn giản và trộn nó vào tất cả các lớp bạn muốn? –

+0

'Trợ giúp cho mô hình' có nghĩa là gì? Có lẽ bạn đang tìm kiếm trang trí? –

+0

Nó sẽ giúp ích nếu bạn đưa ra một ví dụ tôi nghĩ, sau đó mọi người có thể tư vấn về quy ước: có rất nhiều cách để làm bất cứ điều gì, nhưng thường gắn bó với quy ước là một ý tưởng tốt. –

Trả lời

7

Nếu bạn muốn sử dụng một helper_methodmy_helper_method bên trong một model, bạn có thể viết

ApplicationController.helpers.my_helper_method 

Nếu bạn cần một sự linh hoạt chút hơn, ví dụ nếu bạn cũng cần phải ghi đè lên một số phương pháp, bạn có thể làm này:

class HelperProxy < ActionView::Base 
    include ApplicationController.master_helper_module 

    def current_user 
    #let helpers act like we're a guest 
    nil 
    end  

    def self.instance 
    @instance ||= new 
    end 
end 

và sau đó sử dụng với

HelperProxy.instance.my_helper_method 

Nếu bạn có dây thần kinh mạnh, bạn cũng có thể thử đưa số ApplicationController.master_helper_module trực tiếp vào số model của mình.

via: bài đăng của makandracards.

Đối với các bạn tham khảo: http://railscasts.com/episodes/132-helpers-outside-views

+1

Tôi đang tìm kiếm giống nhau và tôi thấy câu trả lời của bạn hữu ích trong trường hợp của tôi. Cảm ơn :) –

+0

@HetalKhunti: Rất vui khi biết bạn thấy nó hữu ích –

8

Nếu những gì bạn đang yêu cầu là nơi để đặt mã được chia sẻ qua nhiều mô hình trong đường ray 4.2, thì câu trả lời tiêu chuẩn phải được sử dụng Mối quan tâm: How to use concerns in Rails 4

Tuy nhiên , có một số đối số tốt (ví dụ: this) để chỉ sử dụng mô-đun đường ray chuẩn bao gồm và mở rộng như marek-lipka đề xuất.

Tôi thực sự khuyên bạn KHÔNG nên sử dụng các phương thức trợ giúp ApplicationController trong một mô hình, vì bạn sẽ nhập nhiều hành lý không cần thiết cùng với nó. Làm như vậy thường là một mùi hôi trong quan điểm của tôi, vì nó có nghĩa là bạn không tách các yếu tố MVC, và có quá nhiều phụ thuộc lẫn nhau trong ứng dụng của bạn.

Nếu bạn cần sửa đổi đối tượng mô hình bằng cách thêm phương thức chỉ được sử dụng trong chế độ xem, thì hãy xem trang trí. Ví dụ: https://github.com/drapergem/draper

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