2011-07-31 42 views
21

Tôi có một phương pháp chung tồn tại trong mô hình của mình bởi vì nó được gọi bởi mô hình của tôi. Nhìn lại, quan điểm của tôi cũng yêu cầu phương thức mô hình này. Để thực hiện điều này, tôi có:Phương pháp phổ biến trong mô hình và trợ giúp

  1. chuyển phương pháp mô hình để các tập tin application_helper.rb
  2. mô hình của tôi gọi phương thức application_helper bằng cách thêm include ApplicationHelper ở phía trên cùng của mô hình ActiveRecord tôi

Chức năng khôn ngoan , nó hoạt động. Nhưng thực hành tốt này?

mẫu của tôi trông như thế này:

class Client < ActiveRecord::Base 
    include ApplicationHelper 
end 
+7

Không , đó là một thực tế tồi tệ. Người trợ giúp được coi là người xem ** xem **, nếu bạn cần thứ gì đó từ người trợ giúp trong mô hình của bạn, nó có thể bị lẫn lộn với chế độ xem của bạn. –

+0

Cảm ơn! Bạn làm cho tôi nhận ra rằng tôi cần phải gọi Client # my_method trong tầm nhìn của tôi ... Tôi đã nhìn chằm chằm vào mã này quá dài ... – Coderama

+0

Chức năng của bạn phụ thuộc là gì? Ví dụ, nó sử dụng 'request' hoặc' params'? –

Trả lời

45

Viết include ApplicationHelper vào mô hình của bạn là thực hành không tốt vì ApplicationHelper là một nơi tuyệt vời để đưa hàng loạt hàm trợ giúp bạn cần trong chế độ xem của mình. Các hàm này sẽ kết thúc bằng việc nhập khẩu như các phương thức mẫu của mô hình của bạn. Các chức năng này chủ yếu không liên quan đến mô hình của bạn và sẽ không hoạt động nếu chúng phụ thuộc vào những thứ như params hoặc request. Dưới đây là hai lựa chọn khác:

Lựa chọn 1:

Bạn chỉ có thể xác định các phương pháp bên trong lớp Client, và sau đó gọi nó là từ quan điểm, như thế này:

class Client < ActiveRecord::Base 
    def self.my_class_method 
    end 
    def my_instance_method 
    end 
end 

Và sau đó theo quan điểm của bạn:

<%= Client.my_class_method %> 
<%= @client.my_instance_method %> 

Phương án 2:

Tạo mô-đun riêng trong lib và bao gồm nó ở những nơi bạn cần. Tên tệp phải khớp với tên mô-đun để tự động tải để hoạt động.

Trong lib/my_module.rb:

module MyModule 
    def my_method 
    end 
end 

Trong mô hình của bạn:

class Client < ActiveRecord::Base 
    include MyModule 
    def other_method 
     my_method 
    end 
end 

Bao gồm các module trong ApplicationHelper nên nó có sẵn cho tất cả các quan điểm của bạn:

module ApplicationHelper 
    include MyModule 
end 

Sau đó, theo quan điểm của bạn bạn có thể gọi nó dễ dàng:

<%= my_method %> 
+0

Tùy chọn 1 là những gì tôi đã kết thúc ... Tôi không biết tại sao tôi lại cố gắng quá mức ... – Coderama

+5

@Coderama, tôi nghĩ Phương án 2 là thêm Rails cách. – sameera207

+0

@ Sameera207 bạn có giải thích lý do tại sao không?:) – Coderama

1

Nếu bạn làm muốn di chuyển nó đến một helper, bạn nên di chuyển nó vào client_helper, vì nó là một cái gì đó chỉ dành riêng cho mô hình khách hàng của bạn và không cho toàn bộ ứng dụng.

Phương pháp bạn nói mặc dù, đó là phương pháp lớp tĩnh hay phương pháp thể hiện? Nếu đó là một phương thức thể hiện, thì các mô hình của bạn (ngay cả khi chúng ở trong chế độ xem) có thể gọi phương thức đó. Nếu đó là một phương thức lớp tĩnh, thì các khung nhìn của bạn cũng có thể sử dụng nó bằng cách gọi nó giống như bất kỳ phương thức lớp tĩnh nào khác (ví dụ: Client.do_method hoặc một cái gì đó).

Tôi không thấy lý do nào tại sao nó cần trợ giúp, trừ khi phương pháp của bạn hoàn toàn không liên quan gì đến mô hình của bạn, trong trường hợp đó sẽ là một câu hỏi khác.

+0

Tôi có thể nghĩ rất nhiều mã nên chắc chắn không có trong một mô hình. Hãy suy nghĩ: Mã giúp xác định các tùy chọn hiển thị (có thể được gọi là bộ điều khiển hoặc chế độ xem), mã kiểm tra quyền truy cập, mã hoạt động với giao điểm của nhiều mô hình không có mối quan hệ quyền sở hữu rõ ràng (ví dụ: mã hoạt động với ' Swimmer' và 'Runner' nhưng không phải' Cycler') v.v. – Domi

1

5 phương pháp thường gặp trong mô hình và helper:

Lựa chọn 1:

    You can just define the method inside the Client class, and then call it from the view, 
        like this: 

        class Client < ActiveRecord::Base 
         def self.my_class_method 
         end 
         def my_instance_method 
         end 
        end 

        And then in your view: 

         <%= Client.my_class_method %> 
         <%= @client.my_instance_method %> 

Phương án 2:

    module MyModule 
         def my_method 
         end 
        end 

        Include the module in ApplicationHelper so it is available to all your views: 

        module ApplicationHelper 
         include MyModule 
        end 

        Then in your view you can call it easily: 

        <%= my_method %> 

tùy chọn 3:

    module MyModule 
         def my_method(amount) 
         end 
        end 

        In your model: 

        class Client < ActiveRecord::Base 
         include MyModule 
         def self.other_method(amount) 
          my_method(amount) 
         end 
        end  

        Then in your view you can call it easily: 

        <%= Client.other_method(amount) %> 

Lựa chọn 4: Hoặc bạn có thể khai báo các phương thức helper như một chức năng lớp, và sử dụng nó như vậy:

    module Myhelper 
         def self.my_village 
          "bikharniyan kallan,Rajasthan,India" 
         end 
        end 

        Then in your view you can call it easily: 

        <%= Myhelper.my_village %> 

tùy chọn 5: sử dụng nhiều helper trong điều khiển helper =>

     module Myhelper 
          def my_info 
           "my information is" 
          end 
         end 

         module Myhelper1 
          def my_village 
           "bikharniyan kallan,Rajasthan,India" 
          end 
         end 

        ApplicationHelper=> 

         module ApplicationHelper 
          include Myhelper 
          include Myhelper1 
         end 

        ApplicationController 

         class ApplicationController < ActionController::Base 
          include ApplicationHelper 
         end 

        YourController 

         class YourController < ActionController::Base 
          def action 
           my_info 
           my_village 
          end 
         end 
+7

Nếu bạn định sao chép một phần câu trả lời đúng nguyên văn, nó sẽ lịch sự để nói rằng nó đến từ tôi. –

+1

Tôi chỉ cần kết hợp tất cả các phương thức tạo nguồn khác nhau cho người dùng – Mukesh

0

Tại thời điểm này, với đường ray 5 bạn chỉ có thể đẩy phương pháp phổ biến của bạn vào application_record.rb

class ApplicationRecord < ActiveRecord::Base 
    self.abstract_class = true 

    def self.common_class_method 
    # some awesome implement 
    end 

    def common_method 
    # implement this 
    end 
end 

Sau đó, trong mỗi lớp mô hình mà bạn có thể gọi common_class_method bởi: YourClassName.common_class_method

hoặc gọi common_method bởi: YourClassInstance.common_method

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