Me lembro que enquanto aprendia Rails me questionava por que usar helpers para tarefas comuns como criar links ou divs… e logo percebi que era uma excelente maneira de ser produtivo ao escrever as views do projeto.
Por exemplo é muito melhor escrever:
<%= stylesheet_link_tag "application","login","common" %>do que:
1 2 3 4 |
<link href="/stylesheets/app.css" media="screen" rel="stylesheet" type="text/css"> <link href="/stylesheets/login.css" media="screen" rel="stylesheet" type="text/css"> <link href="/stylesheets/common.css" media="screen" rel="stylesheet" type="text/css"> |
Por este motivo devemos conhecer bem os helpers do Rails, e um em especial é pouco utilizado ou não utilizado da forma correta. Hoje enquanto alterava a UI de um projeto que tenho trabalho percebi que não tenho usado os helpers label e label_tag da forma correta, especialmente no caso dos radio buttons.
A função do label do html é prover uma forma de você associar um texto (rótulo) a um campo de formulário. E a sintaxe para isto é:
1 2 3 |
<input type="radio" value="selected" name="available" id="available"> <label for="available">Disponível</label> |
ou ainda:
1 2 3 4 |
<label for="available"> <input type="radio" value="selected" name="available" id="available">Disponível </label> |
No caso do radio e checkbox, desta forma você consegue marcar a opção apenas clicando no label ( o que aumenta a área ‘clicável’).
A primeira forma é a mais indicada e no Rails podemos obter o mesmo resultado assim:
1 2 |
<%= f.radio_button :available, "true" %> <%= f.label :available, "Disponível" %> |
Porém, e quando temos dois radios (o que é o normal) como vamos associar o label? O que muitos não sabem é que no caso do radio quando temos dois campos como mesmo nome (estou me referindo a radio1) o Rails concatena o valor do radio ao name.
E outro detalhe que muita gente não sabe é que o label não precisa receber exatamente o nome do radio ou input á quem está associado. Então a boa prática é que quando tiver dois radios faça como abaixo:
1 2 3 4 5 6 7 8 |
<%= f.radio_button :available, "false"%> <%= f.label "available_false", "Fora de estoque" %> <br/> <%= f.radio_button : available, "true"%> <%= f.label "available_true", "Disponível" %> |
Desta forma o rails vai criar o ID dos radios como radio1_false e radio1_true e você poderá associa-los ao label e assim permitir ao usuário que quando clique no texto do radio ele seja marcado e não apenas clicando na bolinha.
Observação
no caso acima como estou usando label e não label_tag é necessário que eu esteja dentro de um form_for ou passe como primeiro parâmetro o objeto á quem pertence o radio. Por exemplo, se este form é para um objeto produto este objeto é representado como o f. na frente do f.radio_button (também poderia usar radio_button(f, :radio_1, “false”) e assim o rails criará o id do html como abaixo:
1 2 |
<input id="product_available_true" name="product[available]" type="radio" value="true"> |
E desta forma o Rails concatena o nome do objeto no id tanto em radio_button quanto em label.
Dica importante
Outra dica muito importante. Se tiver usando o radio para valores boolean para ser gravado no banco de dados, use sempre em string “true” ou “false” e não as pseudo variáveis true e false. Desta forma o Rails vai criar o id como mostrado acima, concatenando true e false ao final do ID e permitindo o uso label corretamente.
Por baixo dos panos
Param quem estiver se perguntando como Rails faz a conversão da string “true”, “1”, “0”, “false” e etc para os devidos tipos boolean então veja o código fonte do método value_to_boolean
2 Comentários to “label e label_tag helpers do Rails”
Filipe diz:
06/09/2009 em 05:08 PM
Olá Daniel,
legal o post. Fiquei com uma dúvida:
E para checkbox tem helper também? como você faz? Porque eu consegui entender como ele cria as labels para 2 radiobutton, true/false, mas e para checkbox com mais de 2 opções?
Abraços, Filipe Bragança
Daniel Lopes diz:
07/09/2009 em 12:30 PM
No caso dos checkbox é um pouco diferente pois cada um terá um valor diferente e você não está restrito a selecionar ou um ou outro, então o label for pode ter exatamente o mesmo id do checkbox.
algo tipo:
<%= f.label :item1, “Produto 1” %>
<%= f.checkbox :item1 %>
Lembrando que vc também poderia usar o label_tag e checkbox_tag quando não estiver usando um form_for e sim um form_tag.
Comentário
CATEGORIAS
HomeDesign
SEO
Empreendimento
Cifras
Ruby e Rails
Flex
Photoshop
Flash
XHTML/CSS
JavaScript
Variados
Database
Firefox
Projetos
3D
Projetos
TextMate
Smalltalk
Mac
Livros
ARQUIVO
07/2010 (2)06/2010 (4)
05/2010 (4)
04/2010 (4)
03/2010 (5)
02/2010 (7)
01/2009 (4)
12/2009 (7)
11/2009 (4)
10/2009 (10)
09/2009 (7)
08/2009 (6)
07/2009 (12)
06/2009 (5)
05/2009 (6)
04/2009 (9)
03/2009 (14)
02/2009 (18)
01/2009 (14)
12/2008 (20)
11/2008 (18)
10/2008 (9)
09/2008 (12)
08/2008 (6)
07/2008 (12)
06/2008 (10)
05/2008 (15)
04/2008 (19)




PomoDo e Pomodoro Technique
comentado por Luis
Flash SlideShow
comentado por Gilmar
50% do software é design
comentado por Daniel Lopes
Vetores Grátis - VectorLab Pack
comentado por louis vuitton
Texturas legais
comentado por thomas sabo kommt