simple_form - 如何使用嵌套输入文本框创建单选按钮

Zac*_*she 4 ruby-on-rails-3 simple-form

我正在使用simple_form来呈现我的表单并尝试获得以下行为:我希望客户端从3个选项中进行选择.在每个选项中,他提供额外的一两个领域.
所以我想要这样的事情:

Please set your preferences:  
 o Pay me on a specific day - [input field to get the day]  
 o Pay me a specific amount of money - [input field for the amount]  
 o Pay me on a regular basis - [radio buttons to choose between weekly/monthly basis]
Run Code Online (Sandbox Code Playgroud)

我可以按如下方式创建单选按钮,但不能在其下添加嵌套字段:

<%= simple_form_for @client, action: 'edit_payment_method' do |f| %>
    <%= f.input :payment_type, label: 'Please set your preferences:',
        collection: [ ['Pay me on a specific day', :specific_day],
        ['Pay me a specific amount of money', :specific_money],
        ['Pay me on a regular basis', :regular_basis]
     ], as: :radio_buttons %>

  <%= f.button :submit, 'Submit' %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

创建嵌套文本框的最佳方法是什么?
至于字段,我不需要将它们发送到不同的控制器(每个payment_type),如果我将它们全部发送到一个方法并根据他选择的支付类型读取相关值,那就没问题了.

谢谢!扎克

fep*_*piv 5

simple_form collection_radio_buttons可能就是你想要的.它的options参数接受一个块,允许您自定义每个单选按钮呈现的内容.看看在rdocs的例子在这里.

编辑:

这基本上是你需要以相对通用的方式做的事情(尚未经过测试,但我正在运行类似的东西).将其他控件放在每个单选按钮的部分控件中:

<% radio_buttons = [
       { :text => 'Pay me on a specific day', :value => :specific_day, :partial => "<textbox_partial_name>", :locals => { :any_locals => :your_partial_needs} },
       { :text => 'Pay me a specific amount of money', :value => :specific_money, :partial => "<textbox_partial_name>", :locals => { :any_locals => :your_partial_needs} },
       { :text => 'Pay me on a regular basis', :value => :regular_basis, :partial => "<radio_partial_name>", :locals => { :any_locals => :your_partial_needs} }, 
  ] %>

<%= simple_form_for @client, action: 'edit_payment_method' do |f| %>
  <%= f.label t("account.update_payment_method.title") %>
  <%= f.collection_radio_buttons :payment_type, (collection.collect do |r| [r[:text], r[:value], r[:partial].nil? ? "" : r[:partial], r[:locals].nil? ? {} : r[:locals]] end), :second, :first do |builder| %>
    <%= builder.label{builder.radio_button(:class => 'payment_method_options') + builder.text} %>
    <% unless builder.object[2].blank? %>
      <%= render :partial => builder.object[2], :locals => builder.object[3] %>
    <% end %>
  <% end %>
  <%= f.button :submit, 'Submit' %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

您可以省略:partial任何不需要其他控件的单选按钮,以及:locals部分不需要它的情况.还有一些方法可以根据您的情况简化此代码,但此示例说明了如何在需要时为每个单选按钮添加更复杂的控制结构.