使表单一次更新多个用户

时间:2015-09-28 18:05:54

标签: ruby-on-rails

我尝试使用一个提交按钮创建一个更新多个用户值的表单。这是我(显然被误导)的尝试:

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

1 个答案:

答案 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)