Ruby on rails rails复杂的形式和构建顺序
我有一个复杂的形式类似于最近的 但是,嵌套元素可以正常工作。我正在创建或更新一个数据网格,比如通过一个表单,其中输入了当天的价格。我的问题从他们留下一个空白开始。我有嵌套的_attributes_for选项,用于不保存nils,它可以工作,如果它们只在特定行中保存一个值,它会保存正确的日期,但是当重新加载时,它会将其放置在错误的列中。我不知道如何将一行中的值排序到表单中。IE星期三的保存值将显示在(正确行的)星期一列中。如果他们为一行保存了所有值,则不会发生这种情况(这样就可以完美地工作) 数据像这样存储在数据库中Ruby on rails rails复杂的形式和构建顺序,ruby-on-rails,ruby,forms,nested,nested-forms,Ruby On Rails,Ruby,Forms,Nested,Nested Forms,我有一个复杂的形式类似于最近的 但是,嵌套元素可以正常工作。我正在创建或更新一个数据网格,比如通过一个表单,其中输入了当天的价格。我的问题从他们留下一个空白开始。我有嵌套的_attributes_for选项,用于不保存nils,它可以工作,如果它们只在特定行中保存一个值,它会保存正确的日期,但是当重新加载时,它会将其放置在错误的列中。我不知道如何将一行中的值排序到表单中。IE星期三的保存值将显示在(正确行的)星期一列中。如果他们为一行保存了所有值,则不会发生这种情况(这样就可以完美地工作) 数据
ID对象\u ID DAYOFWEEK PRICE
并显示如下
+------+----------------+-------+-------+-------+------+-------+
| id | name | Mon | Tue | Wed | Thu | Fri | -> +2 more days etc
+------+----------------+-------+-------+-------+------+-------+
| 1234 | Some name | 87.20 | 87.20 | 87.20 | 82.55| 85.48 |
+------+----------------+-------+-------+-------+------+-------+
| 1234 | Some name | 87.20 | 87.20 | 87.20 | 82.55| 85.48 |
+------+----------------+-------+-------+-------+------+-------+
| 1234 | Some name | 87.20 | 87.20 | 87.20 | 82.55| 85.48 |
+------+----------------+-------+-------+-------+------+-------+
构建或显示这些值的控制器代码如下所示:
控制器
rooms.html.erb
在控制台中订购
错误是在创建表单时发生的-因为您需要根据房间价格的顺序来确定是否正确,所以需要将空(已建)价格放在正确的位置。如果每个房间都有多个房价,则需要生成表单,以便房价在一周中的正确日期。此代码将在新阵列中构建该阵列,并正确设置新阵列:
@rooms.each do |r|
new_rates = []
(0..6).each { |dow|
rate = r.room_rates.find_by_dayofweek(dow)
if rate
new_rates << rate
else
new_rates << r.room_rates.build(:dayofweek => dow)
end
}
r.room_rates = new_rates
end
和/或。。。如果有某种验证可以对整行数据执行,我可以。我怎么能只接受整行或根本不接受?我不知道如何处理为每行创建的7条单独记录。对不起,我应该更清楚,记录中没有不同的字段,而是多条记录。我在帖子的底部添加了费率模型。不过,您添加的第二部分我认为也可能有效。我尝试过类似的事情,但仍然没有得到正确的形式上的顺序-(我已经根据问题中的附加信息编辑了我的答案。第一个看起来应该可以很好地工作。但是它仍然没有正确地排列顺序。我不确定是否还有其他事情发生,但我会尝试在控制台上进行。它似乎在控制台中工作,我在上面的问题中添加了我的结果。因此,有些事情发生了。)表单中可能有错误。您可以在rails控制台中尝试吗?上面粘贴的结果看起来像SQL结果,如果第一个结果正在生成,我会感到惊讶。在任何情况下,您都可能需要添加:order=>“dayofweek”。
<% @dow = 0 %>
<tr class="room">
<td><%= f.text_field :name %></td>
<% f.fields_for :room_rates do |rates| %>
<%= render 'rates', :f => rates %>
<% @dow += 1 %>
<% end %>
<td class="delete_mode" style="display:none;">
<%= f.hidden_field :_destroy %>
<%= link_to_function "remove", "remove_room(this)" %>
</td>
</tr>
<td>
<%= f.text_field :price, :size => 3 %>
<%= f.hidden_field :dayofweek, :value => @dow %>
<%= f.hidden_field :source, :value => 0 %>
</td>
+-------+---------+-----------+-------+--------+---------------------------+---------------------------+
| id | room_id | dayofweek | price | source | created_at | updated_at |
+-------+---------+-----------+-------+--------+---------------------------+---------------------------+
| 92745 | 8 | 0 | 1.0 | 0 | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 |
| 92746 | 8 | 1 | 2.0 | 0 | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 |
| 92747 | 8 | 2 | 3.0 | 0 | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 |
| 92748 | 8 | 3 | 4.0 | 0 | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 |
| 92749 | 8 | 4 | 5.0 | 0 | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 |
| 92750 | 8 | 5 | 6.0 | 0 | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 |
| 92751 | 8 | 6 | 7.0 | 0 | 2010-02-23 14:33:05 +0100 | 2010-02-23 14:33:05 +0100 |
| 92752 | 9 | 3 | 5.0 | 0 | 2010-02-23 14:33:33 +0100 | 2010-02-23 14:33:33 +0100 |
+-------+---------+-----------+-------+--------+---------------------------+---------------------------+
+---------+-----------+-------+--------+---------------------------+---------------------------+
| room_id | dayofweek | price | source | created_at | updated_at |
+---------+-----------+-------+--------+---------------------------+---------------------------+
| 2517 | 0 | | | | |
| 2517 | 1 | | | | |
| 2517 | 2 | 3.0 | 0 | 2010-02-23 17:54:28 +0100 | 2010-02-23 17:54:28 +0100 |
| 2517 | 3 | 4.0 | 0 | 2010-02-23 17:54:28 +0100 | 2010-02-23 17:54:28 +0100 |
| 2517 | 4 | | | | |
| 2517 | 5 | | | | |
| 2517 | 6 | | | | |
+---------+-----------+-------+--------+---------------------------+---------------------------+
@rooms.each do |r|
new_rates = []
(0..6).each { |dow|
rate = r.room_rates.find_by_dayofweek(dow)
if rate
new_rates << rate
else
new_rates << r.room_rates.build(:dayofweek => dow)
end
}
r.room_rates = new_rates
end
// In room model
has_many :rates, :order => "dayofweek"
// In controller
@rooms.each do |r|
(0..6).each { |dow|
if not r.room_rates.find_by_dayofweek(dow)
r.room_rates.build(:dayofweek => dow)
end
}
end