Советы по использованию модулей с Ruby on Rails - PullRequest
4 голосов
/ 08 февраля 2011

Я использую Ruby on Rails 3, и я знаю, в каком случае хорошо использовать Модули.

У меня есть контроллер, включающий множество частных методов, которые я использую в этомпуть:

class UsersController < ApplicationController

  def update
    params[:option1] = get_user_option1
    params[:option2] = get_user_option2


    if params[:option2]
      params[:saving_success] = update_user
    end

    ...

    if params[:saving_success] 
      flash[:notice] = another_method_1
    else
      flash[:error] = another_method_2
    end
  end


    private

      def update_user
        if params[:option1] == something
          @user.save
        end
      end

      def another_method_1
        params[...] = ...
      ...
  end

Как видите, в приватных методах у меня есть такие вещи, как ActiveRecords и методы params .Я знаю, что в модуле вы не можете использовать эти ActiveRecords или методы params напрямую, но вы можете передавать их как аргументы, как в этом примере:

# In the controller file
class UsersController < ApplicationController
  include Users

  def update
    params[:option] = "true"
    @users = Users.find(1)
    Users::Validations.name (@user, params[:option])
    ...
  end
end

# In the module file
module Users
  module Validations
    def Validations.name(user, param)
      user == "Test_name" if param
      # Normally the following is not possible:
      # @user == "Test_name" if params[:option]
    end
  end
end

Итак, что вы посоветуете в моем случае?Хорошо ли использовать отдельные модули?


Вопросы второстепенного значения (на данный момент ...):

  1. А как насчет производительности?

PS I: Не обращайте внимания на простоту примеров.Они написаны просто для того, чтобы понять мою дилемму о передаче ActiveRecords и методов params.

PS II: Если вам нужна другая информация, дайте мне знать.

1 Ответ

9 голосов
/ 08 февраля 2011

Модули имеют 2 основных назначения:

  1. * 1004 Пространство имен *
  2. Примеси

Пространство имен модулей обычно используется для лучшей организации кода и обеспечения более безопасной и согласованной области видимости.

Но модули находят свое основное применение как миксины. Это рубиновый способ обеспечения множественного наследования. Например, допустим, у вас есть методы, к которым нужно обращаться через классы (например, через разные модели / контроллеры и т. Д.). Вместо того чтобы повторять те методы в каждом классе, которые не обязательно применяются только к этому классу, вы абстрагируете эти методы в модуль и включаете или расширяете модуль в соответствующем классе .

Это зависит от того, насколько тесно модуль связан с каталогом приложения, чтобы решить, как где хранить модуль. Несколько шаблонов при хранении модулей:

  1. Каталог / lib, если модуль не особенно «взаимодействует» с приложением /.
  2. Каталог app / models, но может вызвать путаницу с актуальными моделями ActiveRecord.
  3. 37 Сигналы вводят шаблон обработки их как «проблем» и сохранения их в приложении / задачах.

Однако, если у вас есть метод, который вы используете только для своего контроллера пользователя, рекомендуется поместить этот код в модель пользователя, потому что именно там должна быть бизнес-логика для «пользователя».

Под «ActiveRecords» я предполагаю, что вы имеете в виду классы Model (например, User). Вы МОЖЕТЕ получить доступ к модельным классам и выполнять операции ActiveRecord (например, User.find (: all)) над ними в модулях.

Однако, как вы уже догадались, вы не можете использовать params, вам придется передать это как аргумент методу модуля.

...