Ruby on rails Rails嵌套属性:不更新选定字段
我使用Rails 5.1,并且我在存档表单中有一个嵌套属性,它在选择字段中显示多个硬盘:Ruby on rails Rails嵌套属性:不更新选定字段,ruby-on-rails,Ruby On Rails,我使用Rails 5.1,并且我在存档表单中有一个嵌套属性,它在选择字段中显示多个硬盘: <%= form_with(model: archive, local: true, url: archive_path(@archive), method: :put) do |form| %> <div class="field"> <%= form.label :shelfmark %><br /> <%= form.t
<%= form_with(model: archive, local: true, url: archive_path(@archive), method: :put) do |form| %>
<div class="field">
<%= form.label :shelfmark %><br />
<%= form.text_field :shelfmark %>
</div>
<div class="field">
<%= form.label "Harddisk" %><br />
<%= form.select :harddisk_id, Harddisk.order(bezeichnung: :asc).collect {|a| [ a.label, a.id ] } %>
</div>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
例如,当我选择id为2的硬盘时,它不会更新存档表上的harddisk_id属性。它仍然保留硬盘id:1而不是2
rails服务器日志:
Started PATCH "/archives/5" for ::1 at 2018-02-09 13:52:10 +0100
Processing by ArchivesController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"aas9eTl1Vb0JP+KHncyBKts7s1ZJD4l0jRz9wiNi3aiwwDYwkJbt9FXAy6T23sNYONJB1npoprvFtULReEKWIQ==",
"archive"=>{"shelfmark"=>"bar", "harddisk_attributes"=>
{"id"=>"1"}, "harddisk_id"=>"4"}, "commit"=>"Update Archive", "id"=>"2"}
Archive Load (0.4ms) SELECT `archive`.* FROM `archive` WHERE `archive`.`id` = 2 LIMIT 1
(0.3ms) BEGIN
Harddisk Load (0.5ms) SELECT `harddisks`.* FROM `harddisks` WHERE `harddisks`.`id` = 4 LIMIT 1
(0.2ms) ROLLBACK
现在它尝试更新硬盘id记录,但抛出错误:
ActiveRecord::RecordNotFound找不到的ID为1的硬盘
ID为2的存档:
如果您只是想更新:
archive.harddisk_id
并且不更新任何关联硬盘的属性:
archive.attribute.capacity
archive.attribute.created_at
archive.attribute.updated_at
这样,就不需要嵌套的_属性。因此:
解决方案
全部替换
form.fields\u用于:硬盘do。。。结束
…与
form.select:硬盘\u id
此外,您现在可以安全地删除嵌套的_属性的任何跟踪,因为您不再需要它们:
从控制器方法存档参数中删除硬盘属性
remove接受存档模型上的硬盘的\u嵌套\u属性。
这很可能意味着archive.harddisk是nil no value您说harddisk_id是一个归档属性,而不是harddisk属性?然后你不应该使用硬盘字段。选择:硬盘id。但是你可以使用硬盘字段。选择:id代替或使用表单。选择:硬盘id对不起,我错了:不要使用硬盘字段。选择:id而使用表单。选择:硬盘id。前者将尝试更新硬盘记录的id,但您不希望这样做,因为您希望更新存档记录的硬盘\u id。是的,如果您只是要更新存档.harddisk\u id,并且您不更新任何硬盘属性,即容量,则不需要form.fields\u,而不需要form\u。如果您删除了所有form.fields\u for:硬盘,则。。。结束并用form.text\u field:harddisk\u id替换它,您刚才提到的错误应该会消失。
archive.attribute.capacity
archive.attribute.created_at
archive.attribute.updated_at