web-dev-qa-db-fra.com

Méthode commune en model et helper

J'ai une méthode commune qui existe dans mon modèle car elle est appelée par mon modèle. Rétrospectivement, mon point de vue requiert également cette méthode de modèle. Pour ce faire, j'ai:

  1. déplacé la méthode du modèle dans le fichier application_helper.rb
  2. mon modèle appelle la méthode application_helper en ajoutant include ApplicationHelper en haut de mon modèle ActiveRecord

Fonctionnalité sage, ça marche. Mais est-ce une bonne pratique?

Mon modèle ressemble à ceci:

class Client < ActiveRecord::Base
  include ApplicationHelper
end
21
Coderama

Écrire include ApplicationHelper dans votre modèle est une mauvaise pratique, car ApplicationHelper est un endroit agréable pour insérer des tonnes de fonctions d'assistance dont vous avez besoin. Ces fonctions finiront par être importées en tant que méthodes d'instance de votre modèle. Ces fonctions ne sont généralement pas liées à votre modèle et ne fonctionneront pas si elles dépendent d'éléments tels que params ou request. Voici deux autres options:

Option 1:

Vous pouvez simplement définir la méthode dans la classe Client, puis l'appeler depuis la vue, comme suit:

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

Et ensuite à votre avis:

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

Option 2:

Créez un module séparé dans lib et incluez-le là où vous en avez besoin. Le nom du fichier doit correspondre au nom du module pour que le chargement automatique fonctionne.

Dans lib/my_module.rb:

module MyModule
    def my_method
    end
end

Dans votre modèle:

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

Incluez le module dans ApplicationHelper afin qu'il soit disponible pour toutes vos vues:

module ApplicationHelper
    include MyModule
end

Ensuite, à votre avis, vous pouvez l'appeler facilement:

<%= my_method %>
45
David Grayson

5 Méthode commune dans le modèle et l'aide:

Option 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 %>

Option 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 %>

option 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) %>  

Option 4: Ou vous pouvez déclarer la méthode d'assistance en tant que fonction de classe et l'utiliser comme suit:

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

                  Then in your view you can call it easily:

                    <%= Myhelper.my_village %>  

option 5: utilise plusieurs assistants dans le contrôleur 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
1
Mukesh

En ce moment, avec Rails 5, vous pouvez simplement Transférer votre méthode habituelle dans 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

Ensuite, dans chaque classe de modèle, vous pouvez appeler common_class_method par: YourClassName.common_class_method

ou appelez common_method par: YourClassInstance.common_method

1
Nhat Dinh

Si vous voulez voulez le déplacer vers un assistant, vous devez le déplacer dans client_helper, car il s’agit uniquement de votre modèle Client et non de l’application entière.

La méthode dont vous parlez est-elle une méthode de classe statique ou une méthode d'instance? S'il s'agit d'une méthode d'instance, vos modèles (même s'ils se trouvent dans des vues) peuvent appeler cette méthode. S'il s'agit d'une méthode de classe statique, vos vues peuvent également l'utiliser en l'appelant comme toute autre méthode de classe statique (par exemple, Client.do_method ou quelque chose du genre).

Je ne vois aucune raison pour laquelle il faut faire appel à une aide, à moins que votre méthode n'ait absolument rien à voir avec votre modèle, auquel cas ce serait une question différente.

1
MrDanA