Использование collection_radio_buttons на массиве объектов в рельсах - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть массив объектов, и я хочу иметь возможность отображать их, используя collection_radio_button, но похоже, что collection_radio_buttons работает только с массивами или объектами ActiveRecord. Есть ли способ создать collection_radio_button, используя массив объектов?

Это мой массив объектов

[{:image_url=>"https://assets.braintreegateway.com/payment_method_logo/visa.png?environment=sandbox", :card_type=>"Visa", :last_4=>"0004", :expiration_month=>"10", :expiration_year=>"2019"}, {:image_url=>"https://assets.braintreegateway.com/payment_method_logo/visa.png?environment=sandbox", :card_type=>"Visa", :last_4=>"0004", :expiration_month=>"11", :expiration_year=>"2019"}]

Это код, который я пытался написать, но он не работает

<%= collection_radio_buttons("cards", :card, @payment_methods, item_wrapper_tag: false) do |b|
   b.label { b[:last_4]}
end %>

Любая помощь приветствуется

1 Ответ

0 голосов
/ 01 ноября 2019

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

БыстрыйГрязный способ заставить ваш код работать - это превратить ваш массив хэшей в массив объектов, которые отвечают на методы, названные в честь ключей, т.е. мы можем превратить их в OpenStructs с помощью:

@payment_methods = @payment_methods.map { |pm| OpenStruct.new(pm) }

Передача этого нового массива OpenStructs теперь должна выводить на экран то, что вы ищете, без дополнительного блока:

<%= collection_radio_buttons(:cards, :card, @payment_methods, :last_4, :last_4) %>

Возможно, вы захотите / должны изменить другие входные данные - :card, :cards или:last_4 - чтобы получить желаемый результат, который будет работать с формой, которую вы строите.

Другой вариант - просто создать переключатели самостоятельно, без использования встроенного помощника collection_radio_buttons. что-то вроде:

<% @payment_methods.each do |pm| %>
  <%= radio_button_tag 'cards[card]', pm[:last_4] %>
  <%= label 'cards[card]', pm[:last_4] %>
<% end %>
...