15

我有一个有效的 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 生成的那个之上。

4

7 回答 7

20

我认为这里有几个问题。一个是格式,simple_form<div>在输入字段周围添加 a 的方式。@Ron建议使用input_fieldsimple_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 通常假设您想​​要使用模型和字段名称。上面的示例使用 a:symbol而不是 a@model作为此处建议的第一个参数。但这仍然会生成一个名为的输入字段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 %>

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

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

假设我的模型中有这个:

def self.search(search)
  if search
    where('lower(name) LIKE ?', "%#{search.downcase}%")
  else
    scoped
  end
end
于 2012-05-16T22:05:32.300 回答
14

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

于 2012-04-30T23:02:30.073 回答
5

您需要自定义control-groupcontrolsdiv 类以inline-block在它们位于form-inline表单下时显示:

form.form-inline div.control-group { display: inline-block; }
form.form-inline div.control-group div.controls { display: inline-block; }
于 2012-11-09T12:09:20.797 回答
2

添加到马克的回复中:

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

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

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

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

于 2012-05-18T12:09:59.507 回答
1

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

于 2012-04-23T20:50:46.733 回答
0

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

<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>
于 2012-04-23T17:35:41.710 回答
-3

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

于 2012-06-12T08:09:31.213 回答