Pergunta

Como você define um ID personalizado ao usar um auxiliar check_box_tag no Rails?

Eu tenho um loop que cria várias caixas de seleção com base em uma coleção:

- subject.syllabus_references.each do |sr|
      = check_box_tag 'question[syllabus_reference]', sr.id, :id => sr.id
      = label_tag sr.id, sr.name

Gostaria de definir um ID personalizado para que meu rótulo para a caixa de seleção funcione corretamente, mas não consigo descobrir como (:id => sr.id não funciona...).

O problema também pode estar na maneira como defini o rótulo, então, se eu conseguir fazer referência à caixa de seleção correta sem definir um ID personalizado, tudo bem também ...

Foi útil?

Solução

Eu usei isso no meu aplicativo para criar tags de caixa de seleção da coleção e enviar uma matriz delas:

<% @cursos.each do |c| %>
  <span class='select_curso'>
    <%= check_box_tag "vaga[curso_ids][]",
      c.id, (checked = true if form.object.curso_ids.include?(c.id)) %>
    <%= label_tag "vaga[curso_ids][][#{c.id}]", c.nome %>
  </span>
<% end %>

Então, em params, eu tenho uma matriz "curso_ids" => ["1", "3", "5" em vez de uma corda "curso_ids" => "5". Se você quiser retornar um único valor, use vaga [curso_id, caso contrário, use vaga [curso_ids] [ para devolver uma matriz.

Outras dicas

Se você der à caixa de seleção um parâmetro extra, ele funcionará:

= check_box_tag 'question[syllabus_reference]', 1, nil, :id => sr.id

@Gananesh, em sua solução, os parâmetros resultantes hash têm o seguinte formulário:

params[:question][:syllabus_reference] = {1 => 1, 2 => 2, 3 => 3, ...}

Isso deve funcionar melhor para você:

check_box_tag "question[syllabus_reference][]", sr.id, checked, {:id => "question_syllabus_reference_#{sr.id}"

Observe que o terceiro parâmetro (verificado) é necessário para que isso funcione. A matriz de parâmetros resultantes será

params[:question][:syllabus_reference] = {1, 2, 3, ...}

Acho que eu descobri ...

- subject.syllabus_references.each do |sr|
  = check_box_tag "question[syllabus_reference][#{sr.id}]", sr.id
  = label_tag "question[syllabus_reference][#{sr.id}]", sr.name

Isso funciona, mas se você tiver uma maneira melhor, me avise!

Isso foi muito útil e encerrou minha pesquisa de um dia. A maior parte do que eu encontrei até agora continha sintaxe e parâmetros extras que trava sinalizados ou ignorou completamente. Tudo o que quero fazer é passar uma matriz da minha visão para o meu controlador e usar caixas de seleção para informar ao controlador quais elementos da matriz processarem. Consegui reduzir ainda mais o acima, para:

<%= check_box_tag "c[]", c.id %>

onde C vem do meu banco de dados:

<%= @objects.each do |c| %>

É claro que isso passa uma variedade de IDs de objeto para o meu controlador referente apenas às entradas verificadas (as entradas não são controladas por padrão, pois deixei de fora o :falso parâmetro, que por sinal produz o mesmo resultado que :verdadeiro), qual é quase tudo que eu preciso.

Agora eu só preciso passar em um indicador de tipo de objeto - mesmo que apenas uma string literal faça bem - para que o controlador saiba que tipo de objeto é processar sem que eu tenha que aumentar meu modelo com uma coluna extra. Vou começar agora e postar minha solução, mas informe -me se há uma maneira rápida e fácil de fazer isso, se você já souber.

Amostra HAML

Digamos que você tenha um print objeto em algum lugar com um framed atributo, você deve exibir uma lista de prints então dentro do loop você criará um personalizado row e column com ID exclusivo em cada checkbox para atualização framed

.input.row.collapse
  = check_box_tag :framed, print.framed, nil, { id: "framed_#{print.id}" }

Leito,

Apenas para fechar o loop, desisti de tentar passar um indicador de tipo de objeto através check_box_tag. Todo parâmetro que adicionei à sintaxe mostrado no meu último post acima (abaixo ??) simplesmente fez com que o estado da caixa de seleção verificado ao invés de sem controle, sem passar dados adicionais para o controlador.

Enquanto permanecendo alerta para soluções alternativas à medida que elas se apresentam, por enquanto eu incorporo o tipo de objeto no submit_tag valor. Isso vincula a funcionalidade à tela, já que o submit_tag O valor é o que é mostrado ao usuário no botão Enviar, mas pode -se argumentar que isso força a clareza à vista, mesmo que forneça a desambiguação necessária ao controlador.

Aprendendo dia a dia ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top