проблема label_tag и checkbox_tag в рельсах - PullRequest
9 голосов
/ 15 февраля 2011

Я хочу, чтобы мои флажки были пригодными для использования, поэтому я обычно добавляю метки fors для флажков, чтобы вы могли выбирать текст вместо того, чтобы «целиться» для флажка.

Проблема в том, что, если я используюформа вложенных атрибутов в рельсах?У меня есть этот код сейчас:

%ul
  - test_category.test_cases.each do |test_case|
    %li
      = check_box_tag "job_test_cases[]", "#{test_case.id}", test_case.id
      = label_tag "test_case_#{test_case.id}", test_case.name

проблема в том, что он производит это:

<li>
  <input type="checkbox" value="70" name="job_test_cases[]" id="job_test_cases_" checked="checked">
  <label for="test_case_70">Blah blah</label>
</li>

, тогда как я хотел, чтобы это было так:

<li>
  <input type="checkbox" value="70" name="test_case_id[]" id="test_case_70" checked="checked">
  <label for="test_case_70">Blah BLah blah/label>
</li>

Ответы [ 3 ]

8 голосов
/ 03 декабря 2011

Мне удалось сопоставить флажок с меткой следующим образом:

В чекбоксе: Я использовал check_box_tag, указав конкретное имя элемента (роль здесь) в качестве индекса массива, чтобы получить идентификатор со значением в нем. Я передал значение хэша: name, чтобы переопределить имя, указанное в check_box_tag, чтобы оно не имело идентификатор:

check_box_tag "user[roles][#{role.to_s}]", role.to_s, @user.has_role?(role), :name => "user[roles][]"

, который генерирует следующий HTML-код:

<input id="user_roles_ROLE1" name="user[roles][]" type="checkbox" value="ROLE1" />

В метке я указал идентификатор, используя имя массива + '_' плюс имя элемента (роль здесь), чтобы правильно указать идентификатор в метке:

label_tag "user_roles_#{role}", cur_role.role_name, :class => 'span_after_label'

, который генерирует следующий HTML:

<label class="span_after_label" for="user_roles_ROLE1">User</label>

Когда PUT отправляется на контроллер, параметры имеют следующие поля:

"user"=>{ ..., "roles"=>["ROLE1", "ROLE2", "ROLE3"], ... }

это имена ролей для всех проверенных ролей.

Таким образом, для вашего кода я бы попробовал следующее:

check_box_tag "test_case_id[#{test_case.id}]", "#{test_case.id}", test_case.id, :name => "test_case_id[]"
3 голосов
/ 22 марта 2013

Это прекрасно сработало для меня:

= f.label :remember_me do
    = f.check_box :remember_me
    Remember me

Нет необходимости закрывать блок "do". Он закрывается автоматически из-за отступа. Посмотрите на последний пример из Rails API: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-label

0 голосов
/ 18 февраля 2011

При выполнении вложенных форм вам необходимо fields_for, чтобы убедиться, что ваши поля названы правильно (вместо each).

Я бы посоветовал взглянуть на formtastic и cocoon : это значительно упростит создание вложенных форм.

[РЕДАКТИРОВАТЬ: делать это самостоятельно]

Я не уверен, что могу исправить ваш код, потому что вы делаете что-то странно неправильное: я не понимаю, какое значение вы хотите проверить? Вы не отправите это. Это не могло быть идентификатором. Поэтому обычно вы пишете что-то вроде: Исправить ваш код будет просто:

check_box_tag "test_case[#{test_case.id}]", test_case.is_checked?

где поле is_checked? возвращает какое-то логическое значение. Я думаю, это поможет, если вы дадите немного больше информации о том, что вы пытаетесь сделать.

Это создаст что-то вроде

<input type="checkbox" value="true" name="test_case[70]" id="test_case_70" checked="checked">

учитывая is_checked? вернет true.

Если вы хотите явно назвать id и name по-разному, вам нужно будет установить явно, например,

check_box_tag "test_case[#{test_case.id}]", test_case.is_checked?, test_case.is_checked?, :name => 'bla', :id => 'other_bla'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...