0

通常情況下,爲了得到一個日期選擇軌道,我寫這篇文章:分離年,月,日軌形成

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

,並得到這個網站的結果:

<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> 

這種情況的顯示器的工作原理正是我想要的,但是當我試圖提交我重定向到行動的形式:新的沒有通過rails註冊的錯誤,並且沒有創建條目。我從來沒有達到過:創造。我懷疑這可能是因爲我已經手動分隔了date_select分隔的那些日期字段,然後再回到一起,並且rails無法處理這個問題,但我不確定。我該如何解決這個問題並讓表單工作?

回答

-1

您的選擇名稱不是「標準」。 buddy[dob(3i)]不是有效的名稱。

當查詢發送到Rails時,第一個模塊將所有收到的名稱更改爲params。在這裏,它不能和失敗。

你應該設置一些像這樣的想法:buddy[dob_month]

+0

這些名稱是處理組合數據的標準軌道方式,它們在創建參數時由ActionDispatch正確處理,然後由'assign_attributes'方法將它們轉換爲Date或Time(取決於數據庫中列的類型) – BroiSatse

1

你有嵌套窗體 - 這是非法的!大多數瀏覽器都會忽略內部表單標記,因此您最終會得到一個如前所述的DOM結構。外部表單不指定動作屬性,因此瀏覽器會將當前路徑附加爲動作,在本例中爲 - /buddy/new。我有點驚訝,你沒有在這裏得到路由錯誤 - 你有沒有使用match /buddy/new而沒有指定動詞?

反正 - 該解決方案是擺脫周圍的形式(一個與角色),而是重視這個角色給您的通話form_for

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

Woops。發佈後我立即發現了這個問題。謝謝你的幫助! – PoolOfPeas

0

解決了!我只是將form_for更改爲form_tag,現在按預期工作。感謝BroiSatse瞭解ActionDispatch的相關信息,以瞭解如何轉換參數;它鼓勵我去別處尋找問題。