4

我正在尝试传递一个从rfid_tag一个创建一个的表单。设备。数据库中已经存在。 devicehidden_fieldhas_many rfidsrfid

以下是表单中的代码:

<th>RFID Tag #</th>
<td>
  <%= f.label(:@passed_rfid_tag, @passed_rfid_tag) %>
  <%= f.hidden_field :rfid_tag, :value => @passed_rfid_tag %>
</td>
</tr>

以下是 devices_controller 的代码:

def create
   @cabinet = Cabinet.find(params[:device][:cabinet_id])
   @device = Device.create(params[:device])
   @device.rfids << Rfid.where('rfid_tag' => params[:rfid_tag]).first
   @device.row_id = @cabinet.row_id
   @device.save

我收到以下错误,因为rfid_tag不是device. 它是 的一个属性rfid

Can't mass-assign protected attributes: rfid_tag

app/controllers/devices_controller.rb:182:in `create'

谢谢。

4

2 回答 2

7

发生质量分配错误是因为您:rfid_tag作为params[:device]属性哈希的一部分传递。

在您的示例代码中,:rfid_tag需要使用hidden_field_tag表单助手提供该字段。这将防止它被包含在params[:device]哈希中。

<tr>
  <th>RFID Tag #</th>
  <td>
    <%= label_tag 'rfid_tag', 'RFID Tag' %>
    <%= hidden_field_tag 'rfid_tag', @passed_rfid_tag %>
  </td>
</tr>

然后,您可以通过 访问它params[:rfid_tag]。你的create方法应该仍然有效。

于 2013-03-14T20:17:30.153 回答
3

按照 Dan Reedy 所说的去做,并在表单中使用 hidden_​​field_tag。

我担心控制器的 create 方法中的这一行:

@device.rfids << Rfid.where('rfid_tag' => params[:rfid_tag]).first

如果您的 rfid 也有很多设备,那就太好了,这样您就有了多对多的关系。如果 rfid 标签只与一个设备一起使用,但您可能需要将其更改为:

rfid = Rfid.where('rfid_tag' => params[:rfid_tag]).first
rfid.device_id = @device.id
rfid.save!

当然,一定要处理在数据库中找不到从 params 哈希获得的 cabinet_id 或 rfid_tag 的情况。永远不能指望用户提供的输入是有效的或对应于真实记录,即使它来自隐藏字段。

于 2013-03-14T20:34:24.793 回答