JavaFree.org | RubyOnBr.org

Select mais Dry

Acompanhar Select mais Dry 10 posts, 5 participantes

Avatar Borba 4 posts

Olá a todos.
Seguinte, montando uma chave estrangeira em uma tela de cadastro de cidades, onde ele deve pegar os estados em outra tabela, montei o seguinte select no formulario:

Pensando na filosofia MVC, o State.all deveria ficar no controlador e ser passado por uma variável @states_collect.
Porém ela precisa ser repetida nos métodos de edição também.

Tentando deixar mais dry cheguei no seguinte:
No controlador:

E na view:

Funcionou like a charm.
A dúvida é: Está correto segundo a filosofia o Rails e do MVC?
Causaria algum problema eu usar uma global? ou ela só vai existir durante a existência da instância CitiesController?

Grato.

 
Avatar Fernando Luizão 1353 posts

Joga isso num before_filter, acho melhor que usar uma var global:

 
Avatar nofxx 1256 posts

Ah, com ctz… to pra ver algo em Ruby q usa global ainda… a galera ojeriza! hehe
Acho q pq lembra PHP.

Borba, pode usar ‘map’ inves de collect. Collect vai ateh sumir…
Qro parar de usar ‘inject’… ‘reduce’ eh mais bonito =D
(sao todos alias, mesma funcionalidade)

 
Avatar Mereghost 1307 posts

nofxx:

O único lugar que eu ví globais foi em algumas aplicações desktop, na construção da GUI e olhe lá.

Borba:

De fato a dica do Luizão é bem melhor.
Outro modo é usar um collection_select

 
Avatar Borba 4 posts

Valeu pessoal, vou colocar com o filtro.
Estou desenvolvendo a aplicação aos poucos e quero fazer da maneira mais fiel à filosofia do rails. Acredito obter vantagens mais pra frente com isso.

 
Avatar Shairon Toledo 1413 posts

Só uma coisinha de design, isso aqui


State.all(:order => :name)

deve ser evitado na view, pois vc está pulando uma camada. Faça com que sou controller converse com o model.

 
Avatar nofxx 1256 posts

Hmm… isso me lembra que venho usanod helpers pra coisas desse tipo: preciso em vário lugares, nem um pouco dry colocar no*s* controllers.

Ex.:

def state_select
State.all.map {|s| [s.id, s.name] }
end

Tiverem soluções melhores…

 
Avatar Shairon Toledo 1413 posts

:)

 
Avatar nofxx 1256 posts

Hm, pode cre… é uma boa. Qual o nome desse cachezito mesmo? Tem um método no AR pra fazer (ñ me pergunte pq, coisa mais simples de fazer com instance/class vars como o Shairon nos mostra).

Só um add:

Dá no mesmo ;)

 
Avatar Fernando Luizão 1353 posts

@nofxx: memoize o nome da parada