emerleite / demeter Goto Github PK
View Code? Open in Web Editor NEWA Simple way to apply Law of Demeter to your Ruby objects
Home Page: http://codificando.com
A Simple way to apply Law of Demeter to your Ruby objects
Home Page: http://codificando.com
Ao trocar para a versão 2.0.0, notei que uma das minhas rake tasks passou a dar pau (não verifiquei ainda as outras, mas essa é chamada no deploy, por isso notei de cara).
Essa task serve para popular uma tabela com as rotas existentes, para podermos fazer o controle de quais actions podem ser acessadas por quais usuários.
O trecho de código onde o problema ocorre é o seguinte:
gems_path/demeter-2.0.0/lib/demeter.rb:35:in demeter_names' gems_path/demeter-2.0.0/lib/demeter.rb:12:in
method_missing'
release_path/app/models/right.rb:12:in populate_from_routes' release_path/app/models/right.rb:7:in
each'
release_path/app/models/right.rb:7:in `populate_from_routes'
release_path/lib/tasks/rights.rake:27
Eis o código próximo da linha 12 em right.rb
8 action_name = #... lots of code here
9 controller_and_action = # lots of code here too
11 right = Right.find_or_initialize_by_action(controller_and_action)
10
12 right.name = action_name
Lembrando que Right é um modelo do Active Record. Mas este modelo NÃO está marcado como Demeter. Ele possui uma associação com User, mas que também NÃO está marcado como Demeter.
Conforme cada modelo/objeto vai injetando o demeter, a variável demeter_names está sendo armazenada no escopo do model Demeter, vazando as informações entre os objetos.
Ex:
class User < ActiveRecord::Base
has_one :profile, :dependent => :destroy
has_one :avatar, :dependent => :destroy
demeter :profile, :avatar
end
class Avatar < ActiveRecord::Base
belongs_to :user
end
class Profile < ActiveRecord::Base
belongs_to :user
demeter :user
end
User.demeter_names # returns [:profile, :avatar]
Profile.demeter_names # returns [:profile, :avatar, :user]
User.demeter_names#return [:profile, :avatar, :user]
Vi o plugin, dei uma olhada no código, mas fiquei com uma dúvida:
Quais sao as principais diferenças do plugin com o delegate do Rails? Ou do Forwardable da ruby std lib?
Grato!
Caros, peguei outro probleminha com a versão 2.0.1.
Tenho um controller de AdvancedSearches, e uma view com um form onde o usuário pode inserir os campos para busca. Tenho um campo chamado "author", onde gravo o nome do autor que foi usado na busca. Nesse molde:
<%= f.text_field :author %>
Imagino que o demeter nessa versão nova (o erro não ocorre na versão 1.0.4) esteja tentando inferir que o campo é de relacionamento, mas neste caso não é. Provavelmente é por isso que ocorre o erro abaixo:
ActionView::TemplateError (undefined method `before_type_cast' for "":String) on line #13 of app/views/advanced_searches/_search_form.rhtml:
10: <%= f.text_field :keywords %>
11:
12: Autor:
13: <%= f.text_field :author %>
14:
15: Titulo:
16: <%= f.text_field :title %>
(eval):2:in `author_before_type_cast'
demeter (2.0.1) lib/demeter.rb:24:in `send'
demeter (2.0.1) lib/demeter.rb:24:in `method_missing'
app/views/advanced_searches/_search_form.rhtml:13:in `_run_rhtml_app47views47advanced_searches47_search_form46rhtml_locals_action_object_search_form'
app/views/advanced_searches/_search_form.rhtml:4:in `_run_rhtml_app47views47advanced_searches47_search_form46rhtml_locals_action_object_search_form'
Espero ter sido claro na explicação.
Um abraço!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.