Olá Bruno.
Em contraste, crie o alias para o método initialize.
class << self
alias_method :initialize_original initialize
end
O método new chama o initialize por default (teoria sobre Ruby). Não
há um método chamado new.
Entretanto, eu não aconselho você fazer isso. Você deve ser
programador Java (como eu). Primeiro, não desenvolva utilizando as
técnicas e "leis de desenvolvimento" "impostas" pelo Java.
Não faça factory onde não há necessidade. Lembre-se que Ruby é uma
linguagem dinâmica. Em qualquer lugar do código, alguém pode sobre-
escrever seu método "factory". Crie um método de classe que retorne a
instância como você deseja. Exemplo:
class << self
def novo_com_atributos_filtrados(outros_atributos)
outros_atributos.each do |atributo|]
# filtro dos atributos
end
self.new(outros_atributos)
end
end
O exemplo é meio sem sentido, mas eu creio que você captou a idéia.
Tenho um caso de uso: FormularioModelo e FormularioAvaliacao. Há um
cadastro de FormularioModelo (CRUD) e um de FormularioAvaliacao
(semelhante ao caso de uso de Notas Fiscais) para gerar históricos. O
FormularioAvaliacao copia parte dos atributos de FormularioModelo.
Então criei um método de classe que realiza essa cópia (apesar de o
Rails já oferecer um método clone). Vamos explorar o máximo da
flexibilidade de Ruby.
Espero ter ajudado.
Hallison Batista
On 14 dez, 17:32, "Bruno Reis" <
bruno.p.r...@gmail.com> wrote:
> Valeu pessoal, mas e no caso de ser um método de classe, estático?
>
> eu achei na net da seguinte maneira (que confesso que não sei bem o que
> significa) ...
>
> class << self
> alias_method :new_new, :new
> end
>
> #validates_presence_of :conteudo_estado_id,:user_id
> def
self.new
> raise "Deve ser criado pelo factory - Conteudo::criar_topo_hierarquia ou
> conteudo.criar"
> end
>
> Mas aí quando eu chamo Class.new_new ele chama o new e da um 'raise' no erro
> mesmo assim.
>
> O que eu quero realmente é fazer com que a classe, um model, não possa ter
> seu método new chamado diretamente. Quero deixar isso em um contexto privado
> e gerar um método público que por sua vez chama o new e inicializa algumas
> variáveis (tipo um factory). Alguém sabe como fazer isso?
>
> Bruno
>
> Em 13/12/07, hallison.batista <
hallison.bati...@gmail.com> escreveu: