我尝试使用一个提交按钮创建一个更新多个用户值的表单。这是我(显然被误导)的尝试:
<h1>Set Days</h1>
<%= form_for User do |f| %>
<% f.fields_for :all do |user_form| %>
<div class="row">
<div class="col-md-3">
<span><%= user_form.label :name %></span>
</div>
<div class="col-md-9">
<%= f.fields_for user.name do |user_form| %>
<table class="days-table">
<tr>
<td>M</td>
<td>Tu</td>
<td>W</td>
<td>Th</td>
<td>F</td>
</tr>
<tr>
<td><%= user_form.check_box :monday, {}, true, false %></td>
<td><%= user_form.check_box :tuesday, {}, true, false %></td>
<td><%= user_form.check_box :wednesday, {}, true, false %></td>
<td><%= user_form.check_box :thursday, {}, true, false %></td>
<td><%= user_form.check_box :friday, {}, true, false %></td>
</tr>
</table>
<% end %>
</div>
</div>
<% end %>
<%= f.submit "Save", class: "btn btn-primary" %>
<% end %>
我使用此代码收到此错误:
undefined method `to_key' for #<Class:0x007fdcda98dc08>
答案 0 :(得分:1)
你得到了那个特定的错误,因为在引擎盖下,Rails&#39; form_for(record, options = {}, &block)
将尝试向第一个参数发送to_key
消息。
要完成您尝试做的事情,form_tag会让您感觉更好。
一次更新多个记录不是 RESTful 。
例如,一条记录的约定是:
PATCH /resources/:id { new data payload... }
# you're updating a specific resource
使用多个记录,您不能依赖传统的REST端点,并且需要让服务器逻辑处理该过程。例如:
POST /resources { ids: [x, y, z], data: {...} }
因此,构建表单时不将其与特定记录(用户form_tag
,而不是form_for
)相关联,并向POST请求添加要更新的记录的ID列表。
只需小心,并考虑到这会让您受到攻击。如果用户决定调整表单的html以更新其他记录,该怎么办?您应该在服务器端使用某种授权技术,或者不在表单中添加该列表。
然后,在服务器端,您可以使用以下内容:
Resource.where(id: params[:id_list]).update_all(sanitized_params)
def sanitized_params
params[:my_updates].your_sanitization_logic
end
或者,如果您的资源已经与当前用户相关联,则这是一种常见模式:
current_user.resources.where(id: params[:id_list]).update_all(sanitized_params)