【问题标题】:Creating custom radio button helper in application_helper在 application_helper 中创建自定义单选按钮助手
【发布时间】:2012-12-19 09:31:26
【问题描述】:

我想通过 Bootstrap 创建自定义单选按钮。 我做到了,但我想在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

但它不起作用。有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 twitter-bootstrap


    【解决方案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-tags 的数组。

    那么你必须修复这条线:

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

    您正在尝试执行插值 (#{..}),但您将其包裹在单引号 '..' 中。如果您有一个包含混合单引号/双引号的字符串,您可以使用%[ ... ](其中[ 是一个偏好问题,您可以使用%{...} 或其他括号)。

    另外,content_tag 不适合 inputinput 标签必须有什么内容?对了,一点内容都没有!所以请改用简单的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 =&gt; {:toggle =&gt; "button"}, 部分必须告诉你Rails 助手知道这个属性。

    【讨论】:

    • 太棒了!非常感谢。
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2015-10-20
    • 2013-10-07
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多