以铁轨形式分隔年,月和日

时间:2015-01-08 17:33:13

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

通常,为了在rails中选择日期,我写下:

<%= form_for(:buddy, :url => {:action => :create}) do |f| %>
<%= f.date_select(:dob) %>
<%= f.submit("HI") %>
<% end %>

并得到这个html:

<form action="/buddy/create" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="Qs8RK+6gEt9ZoycMbMHwX4xMyoFpRvjA/El3cLnO30RXddr864WmEXzyAgYtXBe5Y9l0zC3UDw4ggRw1xYW1sg==" />
<select id="buddy_dob_1i" name="buddy[dob(1i)]">
<option value="2010">2010</option>
<!-- ETC -->
<select id="buddy_dob_2i" name="buddy[dob(2i)]">
<option value="1" selected="selected">January</option>
<!-- ETC -->
<select id="buddy_dob_3i" name="buddy[dob(3i)]">
<option value="1">1</option>
<!-- ETC -->
<input type="submit" name="commit" value="HI" />

但现在我正在使用bootstrap。如果我使用bootstrap_form_for gem,我会遇到这样的问题:在小屏幕上,这三个选项相互叠加,这是不可接受的。所以我提出了我认为是一个很好的解决方案:将每个选择放在一个表的不同字段中,这可以防止这种行为。所以我写了这段代码:

  <%= form_for(:buddy, {:action => :create, :role => 'form'}) do |f| %>
  <div class="form-group">
    <label for="buddy_dob">Date of Birth</label>
    <table class="table functional-table">
      <tr>
        <td> 
          <%= select_year(Date.today, {:start_year => DateTime.now.year, :end_year => DateTime.now.year - 117}, {:name => 'buddy[dob(1i)]', :id => 'buddy_dob_1i', :class => 'form-control'}) %>
        </td>
        <td>
          <%= select_month(Date.today, {}, {:name => 'buddy[dob(2i)]', :id => 'buddy_dob_2i', :class => 'form-control'}) %>
        </td>
        <td>
          <%= select_day(1, {}, {:name => 'buddy[dob(3i)]', :id => 'buddy_dob_3i', :class => 'form-control'}) %>
        </td>
      </tr>
    </table>
  </div>
  <div class="form-group">
    <%= f.submit("HI") %>
  </div>

  <% end %>

产生这个结果:

<form role="form" action="/buddy/new" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="6Ek01J6PIgzHl/NLpjI6V+kolUVCpw7jrQTF8eYT3ef98/8Dm6qWwuLG1kHnr92xBr0rCAY1+S1xzK60mli3EQ==" />
  <div class="form-group">
    <label for="buddy_dob">Date of Birth</label>
    <table class="table functional-table">
      <tr>
        <td> 
          <select id="buddy_dob_1i" name="buddy[dob(1i)]" class="form-control">
            <option value="2015" selected="selected">2015</option>
              <!-- ETC -->
        </td>
      </tr>
    </table>
    <table class="table functional-table">
      <tr>
        <td>
          <select id="buddy_dob_2i" name="buddy[dob(2i)]" class="form-control">
          <option value="1" selected="selected">January</option>
          <!-- ETC -->
        </td>
      </tr>
    </table>
    <table class="table functional-table">
      <tr>
        <td>
          <select id="buddy_dob_3i" name="buddy[dob(3i)]" class="form-control">
          <option value="1" selected="selected">1</option>
          <!-- ETC -->
        </td>
      </tr>
    </table>
  <div class="form-group">
    <input type="submit" name="commit" value="HI" />
  </div>
</form>

这个显示的工作方式与我想要的完全一样,但是当我尝试提交表单时,我被重定向到了操作:new没有由rails注册的错误,也没有创建任何条目。我永远不会达到:创造。我怀疑这可能是因为我手动分隔了date_select分离的日期字段,然后将它们分开并且rails无法处理这个,但我不确定。我该如何解决这个问题并使表单正常工作?

3 个答案:

答案 0 :(得分:1)

你有嵌套表格 - 这是非法的!大多数浏览器都会忽略内部表单标记,因此您最终会得到一个DOM结构。外部表单未指定action属性,因此浏览器会将当前路径追加为操作,在本例中为/buddy/new。我有点惊讶你没有在这里得到路由错误 - 你是否有机会在不指定动词的情况下使用match /buddy/new

无论如何 - 解决方案是摆脱周围的形式(具有角色的形式),而是将此角色附加到您的form_for电话:

<%= form_for(:buddy, url: {action: :create}, html: {role: :form) do |f| %>

答案 1 :(得分:0)

解决了!我刚刚将form_for更改为form_tag,现在它按预期工作。感谢BroiSatse获取有关如何转换params的ActionDispatch的信息;它鼓励我到别处寻找问题。

答案 2 :(得分:-1)

您选择的名称不是&#34;标准&#34;。 buddy[dob(3i)]不是有效名称。

当查询发送到Rails时,第一个模块将所有收到的名称更改为params。在这里,它不会失败。

您应该像这样设置一些想法:buddy[dob_month]