【问题标题】:Simple_form bootstrap style inline-form not working properlySimple_form 引导样式内联表单无法正常工作
【发布时间】:2012-04-23 10:52:58
【问题描述】:

我有一个有效的 twitter bootstrap 安装,简单的表单生成以下内容:

<form accept-charset="UTF-8" action="/find_map" class="simple_form form-inline" id="new_location" method="post" novalidate="novalidate"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="p5CSoidWaoGMfHY0/3ElWi0XJVg6Cqi9GqWRNlJLBQg=" /></div>
        <div class="control-group string required"><div class="controls"><input class="string required" id="location_address" name="location[address]" placeholder="Address" size="50" type="text" /></div></div><input class="btn" name="commit" type="submit" value="Find!" />
</form>

不知何故“找到!”按钮不会与搜索框出现在同一行。有什么想法吗?

谢谢!

更新:

对不起,我应该提到所有标记都是由 simple_form 基于以下内容生成的:

<%= simple_form_for @location, :url => find_map_path, :html => { :class => 'form-inline' } do |f| %>

        <%= f.input :address, :label => false, :placeholder => "Address" %>
        <%= f.submit "Find!", :class => 'btn' %>

<% end %>

所以,确实,生成的标记似乎存在问题,即使我已经运行了 simple_form 的引导安装等。

上图显示的是一个直接的html表单

<form class="form-inline">
  <input type="text" class="input-small" placeholder="Email">
  <button type="submit" class="btn">Sign in</button>
</form>

...在 simple_form 生成的那个之上。

【问题讨论】:

  • 不能修改标记?输入按钮需要位于 .controls div 内,以便它位于输入字段旁边。
  • 其实这样可以让生活更轻松,但是 div 是由 simpleform 生成的。谢谢!
  • 如果您不能修改标记,那么您将不得不依赖 hacky 方法,例如:input { float: left; }

标签: ruby-on-rails twitter-bootstrap simple-form


【解决方案1】:

我认为这里有几个问题。一个是格式化,simple_form 在输入字段周围添加&lt;div&gt; 的方式。 @Ron 使用 input_field 的建议适用于 simple_form 2.0.1。我的示例是在联系人表中搜索姓名。以下使文本框和按钮并排显示:

<%= simple_form_for :contact, :method => 'get', 
    :html => { :class => 'form-search' } do |f| %>
  <%= f.input_field :search, :placeholder => "Name", 
      :class => "input-medium search-query" %>
  <%= f.submit "Find!", :class => "btn" %>
<% end %>

另一个问题是 simple_form 通常假设您想​​要使用模型和字段名称。上面的示例使用:symbol 而不是@model 作为建议here 的第一个参数。但这仍然会生成一个名为 contact[search] 的输入字段,因此您必须告诉控制器如何处理。

我认为在这种情况下,使用 simple_form 而是使用类似于 Ryan Bates'Railscast #240, Search, Sort, Paginate with AJAX 开头附近的表单可能会更简单:

<%= form_tag contacts_path, :method => 'get', :class => "form-search" do %>
  <%= text_field_tag :search, nil, :placeholder => "Name", 
      :class => "input-medium search-query" %>
  <%= submit_tag "Find!", :name => nil, :class => "btn" %>
<% end %>

现在该字段被命名为“搜索”,我可以在控制器的 #index 方法中使用它,如下所示:

@contacts = @contacts.search(params[:search])

假设我的模型中有这个:

def self.search(search)
  if search
    where('lower(name) LIKE ?', "%#{search.downcase}%")
  else
    scoped
  end
end

【讨论】:

  • 如何使用上面的代码正确添加表单标签? f.label "label" 不融入布局,炫耀
  • @rubytastic,由于 SimpeForm 没有为您创建标签(另请参见 Carlos Antonio 的回答的第一句话),您可能需要自己格式化标签。您可以尝试从 Bootstrap 和/或 SimpleForm(可能是 label class="control-label"&gt;My label&lt;/label&gt;)“借用”一些样式,或者编写自己的 CSS 以使其融入其中。
【解决方案2】:

它正在创建子表单,因为您将 input 传递给 simple_form。请改用input_field。 (顺便说一句,这也适用于 simple_fields_for)。

【讨论】:

    【解决方案3】:

    您需要自定义control-groupcontrols div 类,以在form-inline 表单下显示为inline-block

    form.form-inline div.control-group { display: inline-block; }
    form.form-inline div.control-group div.controls { display: inline-block; }
    

    【讨论】:

      【解决方案4】:

      添加到 Mark 的回复中:

      所以,input_field 仅用于创建 input 组件,它不会为您提供任何类型的标签/错误/包装器。这意味着您不会得到任何或标签包装该字段,您应该手动执行此操作以防万一。

      现在关于将表单与对象一起使用,SimpleForm 是一个 FormBuilder,这意味着创建它是为了与命名空间(对象或符号)一起使用。 SimpleForm 的 simple_form_for == Rails 的 form_for,您总是需要一个对象命名空间来使用。

      对于像搜索表单这样简单的情况,您最好使用简单的表单助手,例如form_tag,正如您所指出的那样。没有必要依赖simple_form_forform_for,我同意,我通常会走这条路。

      希望对您有所帮助,如果您仍有疑问,请告诉我。

      【讨论】:

      • 感谢澄清,我尝试添加 :label => "" 不起作用,您在上面解释了原因。您是否知道如何使用正确的 twitter bootstrap 样式添加标签?只是 f.label ="my label" 弄乱了布局,然后标签就被放置了。谢谢!
      【解决方案5】:

      将 :html => { :class=> 'form-inline' } 更改为 :html => { :class=> 'form-horizo​​ntal' }

      【讨论】:

      • 这对我有用:字段名称和输入框现在是并排的,尽管现在字段名称之前有相当宽的水平空间。
      【解决方案6】:

      你不能移动输入地址旁边的输入按钮吗?我认为它会解决问题

      <form accept-charset="UTF-8" action="/find_map" class="simple_form form-inline" id="new_location" method="post" novalidate="novalidate">
            <div style="margin:0;padding:0;display:inline">
          <input name="utf8" type="hidden" value="&#x2713;" />
          <input name="authenticity_token" type="hidden" value="p5CSoidWaoGMfHY0/3ElWi0XJVg6Cqi9GqWRNlJLBQg=" />
            </div>
            <div class="control-group string required">
          <div class="controls">
              <input class="string required" id="location_address" name="location[address]" placeholder="Address" size="50" type="text" />
      
              <!-- move the button to here -->
              <input class="btn" name="commit" type="submit" value="Find!" />
          </div>
            </div>
      
      </form>
      

      【讨论】:

        【解决方案7】:

        请所有遇到此问题的人,不要使用流畅的布局,并确保为文档指定 HTML5 文档类型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多