Ruby on Rails: интерпретация ввода формы как целого числа - PullRequest
3 голосов
/ 25 июня 2010

У меня есть форма, которая позволяет пользователю собрать хеш.

Требуемый формат конца хэшей будет выглядеть примерно так:
{1 => "a", 2 =>"x", 3 => "m"}

Я могу создать нечто похожее, имея множество входных данных, в именах которых есть внутренние скобки:

<%= hidden_field_tag "article[1]", :value => a %>

Однако конечный результатэто то, что строит хеш, где все ключи являются строками, а не целыми числами:
{"1" => "a", "2" => "x", "3" => "m"}

В настоящее время я исправляю это, генерируя новый хэш в контроллере, зацикливая входной хэш, а затем назначая его параметрам.Есть ли более чистый и сухой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 26 июня 2010

Ваши параметры всегда будут иметь строковые ключи и значения.Самый простой способ исправить это - написать собственное расширение в Hash или просто вставить его, как требуется:

numeric_keys = params['article'].inject({ }) do |h, (k, v)|
  h[k.to_i] = v
  h
end

Затем у вас есть хеш с ключами, преобразованными в целые значения, как вам нравится.

Простое расширение может быть:

class Hash
  def remap_keys
    inject({ }) do |h, (k, v)|
      h[yield(k)] = v
      h
    end
  end
end

Это гораздо более универсальное и может быть использовано в соответствии с:

params['article'].remap_keys(&:to_i)
1 голос
/ 26 июня 2010

Это зависит от того, для чего вы хотите его использовать.Может быть, проще использовать строки в качестве ключей и выполнять «преобразование» при доступе к массиву (или не делать его вообще)?

Также возможно построить массив, используя что-то вроде

<%= hidden_field_tag "article[]", :value => "x" %>

это вернет "article" в виде массива, и вы можете получить к нему доступ напрямую по индексу.Однако никак не повлиять на позицию - массив будет содержать все значения в порядке их появления.

Наконец, вы можете создать свою собственную версию Hash или просто изменить ключи, как было объяснено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...