在创建自定义application_helper单选按钮帮手(Creating custom rad

2019-10-17 12:49发布

我想通过引导创建自定义单选按钮。 我做到了,但我想加入这个application_helper控制。

我目前的解决方案

<div class="btn-group" data-toggle="buttons-radio">
      <% @engines2.each do |e| %>
        <button type="button" class="btn <%= @car.engine_id == "#{e.id}".to_i ? 'active' : '' %>" data-toggle="button" onclick="javascript:document.getElementById('car_input_engine_id').value='<%= "#{e.id}" %>'">
            <%= "#{e.name}" %>
        </button>
      <% end %>
      <input type="hidden" id="car_input_engine_id" name="car[input_engine_id]" value="<%= @car.engine_id %>" />
 </div>

期望中的使用

<%= form_for @car, :method => "post" do |f| %>
  <%= checkbox_bootstrap_tag(@engines2, @car.engine_id) %>
    <%= f.submit "Test Post", :class => "btn btn-inverse" %>
<% end %>

帮手

 def checkbox_bootstrap_tag(engines, car_engine_id)   
    content_tag :div, :class=>"btn-group", "data-toggle"=>"buttons-radio" do
      engines.each do |e|
        content_tag :button, :type => :button,
        :class=>'btn #{car_engine_id == #{e.id}.to_i ? "active" : ""}',
        "data-toggle"=>"button", 
        :onclick=>"javascript:document.getElementById('car_input_engine_id').value=#{e.id}" do
           e.name       
        end
      end
      content_tag :input, :type => :hidden, :id=>"car_input_engine_id", :name=>"car[input_engine_id]", :value=>car_engine_id
    end
  end

但是,这是行不通的。 有任何想法吗?

Answer 1:

看看这个片断:

  engines.each do |e|
    ...
  end

它预制件东西,但它的结果是怎么回事了,因为之后还有一个多行:

content_tag :input, :type => :hidden, :id=>"car_input_engine_id", :name=>"car[input_engine_id]", :value=>car_engine_id

所以,你必须来连接两个结果:的engines.each ...而此行的结果。

我认为你是刨去使engines.map代替engines.each :获得数组button标签都有效。

然后,你必须解决这一行:

:class=>'btn #{car_engine_id == #{e.id}.to_i ? "active" : ""}',

你试图进行插值( #{..}但你把它包在单引号'..' 。 您可以使用%[ ... ]其中[是偏好的问题,你可以使用%{...}或其他支架如果你想)如果你有混合单/双引号的字符串。

content_tag用于input是不适合的。 什么内容的input标签必须有? 对,没有内容可言! 因此,使用简单的tag辅助来代替。

所以,这里是我得到了什么:

def checkbox_bootstrap_tag(engines, car_engine_id)   
  content_tag :div, :class=>"btn-group", "data-toggle"=>"buttons-radio" do
    engines_html = engines.map do |e|
        content_tag :button, 
          :type => :button,
          :class=> %[btn #{car_engine_id == e.id ? "active" : ""}], 
          :data => {:toggle => "button"},
          :onclick=> "javascript:document.getElementById('car_input_engine_id').value=#{e.id}" do
            e.name       
        end
      end
    safe_join(engines_html) +
      tag(:input, :type => :hidden, :id=>"car_input_engine_id", :name=>"car[input_engine_id]", :value=>car_engine_id)
  end
 end

注的用法safe_join :这个助手是用于合并数组元素与HTML标记非常有用(输出前无法逃脱它们)。

另外:data => {:toggle => "button"},部分必须告诉你,Rails的佣工都知道这个属性。



文章来源: Creating custom radio button helper in application_helper