通常,为了在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="✓" /><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="✓" /><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无法处理这个,但我不确定。我该如何解决这个问题并使表单正常工作?
答案 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]
。