Rails 3 как бороться с константами - PullRequest
1 голос
/ 18 марта 2012

У меня есть константа с именем PAYMENT_METHODS в venue.rb.

PAYMENT_METHODS = ['Visa', 'MasterCard', 'American Express', 'Diners', 'JCB', 'Bankomat', 'sodexo', 'MA-Gutscheine']

Вы можете отмечать / снимать флажки в форме оплаты (payment_options - целое число):

<%= hidden_field_tag "venue[payment_options][]", nil %>
<% Venue::PAYMENT_METHODS.each do |category| %>
  <%= check_box_tag "venue[payment_options][]", category %>
  <%= label_tag category %>
<% end %>

Теперь я хочу сохранить выделение, но значением каждого флажка является название варианта оплаты.Я думаю, что мне нужно как-то добавить ключ в хранилище только ключей.

Как установить ключи и сохранить коллекцию в базе данных?

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 18 марта 2012

Сделайте константу хешем или массивом, например,

PAYMENT_METHODS = {'Visa' => 1, 'MasterCard' => 2, 'American Express' => 3, 'Diners' => 4, 'JCB' => 5, 'Bankomat' => 6, 'sodexo' => 7, 'MA-Gutscheine' => 8 }

Теперь они будут в формате, который вы можете передать options_for_select http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-options_for_select.

Если вы (действительно) хотите установить флажки, с массивом все в порядке, просто зацикливайтесь, используя PAYMENT_MTHODS.each_index do |index|, чтобы получить итератор, который является значением, а затем используйте PAYMENT_METHODS[index].

Я всегда находил странным, что ключ хеша - это часть, отображаемая в списке, но я думаю, что имеет смысл, что значение - это то, что связано со значением опции: -).

1 голос
/ 18 марта 2012

Сохраните само строковое значение, в этом нет ничего плохого.

Лучше создать такую ​​модель, как PaymentType, и просто оставить id,name и просматривать все типы платежей. Таким образом, вы можете лучше манипулировать всемидоступные варианты оплаты в будущем из админ-панели (при необходимости) вместо перехода на уровень кода и изменения на постоянной.

0 голосов
/ 15 июня 2012

Что касается

Мне всегда казалось странным, что ключ хеша - это часть, отображаемая в списке, но я думаю, что имеет смысл, что значение - это то, что связано со значением параметра.: -).

Вы можете это сделать (это меня тоже немного беспокоило)

<% Post::TECH_CATEGORY.each do |category| %>
  <%= label_tag 'name', category[0] %>
  <%= check_box_tag 'tech_cat', category[1] %>
<% end %>

Теперь имеет смысл видеть это на экране,Каждый объект имеет два значения, поэтому ...

category[0]

всегда будет ключом, который вы указали для конкретного объекта, который вы в данный момент перечисляете по

category[1] 

, будет значением этоготот же объект.На экране выглядит лучше.

, как в приведенном выше примере

<label for="name"> Visa </label>
<input id="tech_cat" name="tech_cat" type="checkbox" value="1" />

Приветствия,

0 голосов
/ 19 марта 2012

Вы можете использовать индекс элемента в качестве ключа.Используйте Array#index в ваших интересах.

PAYMENT_METHODS.index("Visa")   #=> 0
PAYMENT_METHODS[0]              #=> "Visa"

PAYMENT_METHODS.index("Diners") #=> 3
PAYMENT_METHODS[3]              #=> "Diners"

Предостережение: это сломается, если вы измените порядок PAYMENT_METHODS.Вы вводите элемент в его относительную позицию в массиве.Измените массив, и вы измените ключи.Избегайте неприятностей, сохраняя свои константы постоянными .

...