Como criar e usar um módulo usando Ruby on Rails 3?


90

Estou usando Ruby on Rails 3 e gostaria de mover algum código personalizado e compartilhado em um módulo.

  1. Qual sintaxe devo usar para escrever o código do módulo?
  2. Em qual pasta do meu aplicativo devo colocar o arquivo do módulo?
  3. Como devo incluir esse módulo em uma ou mais classes de controlador?
  4. Que outra ação, se houver, devo usar o módulo personalizado em qualquer lugar do meu aplicativo?
  5. Como posso chamar métodos no módulo de meu aplicativo?

Desde já, obrigado.


2
Muito bom! Eu precisava disso.
Arup Rakshit

Respostas:


115

Para 1. Um módulo é criado / aberto simplesmente dizendo:

module MyModule
  def first_module_method
  end
end

Para 2. A libpasta. Se você deseja organizar seus módulos na libpasta, pode colocá-los nos próprios módulos. Por exemplo, se você quiser uma subpasta, super_modulesseus módulos serão definidos da seguinte forma:

module SuperModules
  module MyModule
    def first_module_method
    end
  end
end

Para 3./5. Ao incluir o módulo em uma classe, você pode simplesmente chamar os métodos dos módulos como se fossem definidos na classe:

class MyClass
  include MyModule
  def some_method
    first_module_method #calls module method
  end
end

Para 4. Primeiro, certifique-se de que seu módulo seja realmente necessário em todas as classes de seu aplicativo. Caso contrário, faz sentido incluí-lo apenas onde for necessário para não sobrecarregar as classes que não precisam dele de qualquer maneira. Se você realmente deseja o módulo em todos os lugares, inclua uma olhada na hierarquia de classes de suas classes no aplicativo. Você quer o módulo em todos os modelos? Você pode abrir ActiveRecord :: Base e adicionar seu módulo lá.


2
Para organizar os arquivos, posso criar uma subpasta na pasta 'lib'? Se sim, o que muda?
user502052

2
@ user502052 Eu atualizei a resposta ao ponto 2 para responder a essa pergunta.
Stephan

3
Muitas coisas não estão claras aqui. Quais nomes de arquivo fornecer? Como chamar os métodos sem incluir todo o módulo? Não acredito que haja tantos votos positivos, pois ainda não sei como usar um módulo no final.
Augustin Riedinger

5
Depois de criar um módulo como acima, incluindo-o na libpasta, uma nota importante é permitir que Rails3 descomente a linha config\application.rbpara config.autoload_paths- leia, por exemplo, stackoverflow.com/questions/1073076/rails-lib-modules-and ... Nota também que você deve ter cuidado ao usar um nome de arquivo para o seu módulo que corresponda ao próprio nome do módulo. Portanto, se você salvá-lo lib/test/my_module.rb, terá que include Test::MyModule- para obter mais detalhes, consulte stackoverflow.com/questions/4073856/rails-3-autoload
sameers

6
Acabei de encontrar esta velha resposta minha. :( Eu quero downvote. Não coloque nada em lib! Coloque seu código (incluindo módulos adicionais) para app/modelsque o código precisa de acesso a outros modelos. Se o código é verdadeiramente uma 'biblioteca' e pode existir por si só, I sugira vender uma gema. Para exemplos, consulte github.com/shageman/the_next_big_thing
Stephan

3

A> 1. Você pode usar a mesma sintaxe de qualquer outra classe ruby. Por exemplo, estou definindo um módulo VehicleClassifer que vai usar o método classify_vehicle para classificar um veículo com base no número de rodas que ele recebe como entrada.

module VehicleClassifer
  def classify_vehicle(number_of_wheels)
    VehicleType.where("number_of_wheels = ?", number_of_wheels)
  end
end

A> 2. Os módulos geralmente são armazenados na pasta / lib.

as questões 3,4,5 têm mais ou menos a mesma resposta. você pode usar

class SomeController < ApplicationController
  include VehicleClassfier

  def index 
    classify_vehicle(4)  
  end
end

na aula você está usando o módulo e terá acesso a todos os métodos do módulo.

Além disso, caso precise usar um módulo em todo o seu aplicativo, você pode incluí-lo no controlador de aplicativo.


2
Eu tentei isso e obtive um erro de método indefinido. Alguma ideia do que estou fazendo de errado?
Tony

Tem certeza de que seu módulo está acessível? stackoverflow.com/questions/6604272/… talvez te ajude?
Shreyas

1
@Tony - Você pode precisar reiniciar seu servidor - mesmo no modo dev, para que os métodos do módulo estejam disponíveis. E cada vez que você altera o código em seu módulo, você deve reiniciar o servidor novamente. Por exemplo, se houver um erro, ou será um erro no código antigo, mas realce o novo código nessa linha na mensagem de erro - muito confuso.
JosephK de

Alguma ideia de como incluir e usar esses módulos personalizados dentro ApplicationHelper?
WM,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.