我正在尝试从一个表单传递一个rfid_tag,该表单从hidden_field创建device。Device has_many rfids。该rfid已存在于数据库中。
下面是表单中的代码:
<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'谢谢。
发布于 2013-03-15 04:17:30
由于您正在将:rfid_tag作为params[:device]属性散列的一部分进行传递,因此会发生批量分配错误。
在示例代码中,需要使用hidden_field_tag表单帮助器提供:rfid_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-15 04:34:25
照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的情况。不能指望用户提供的输入是有效的或对应于真实记录,即使它来自隐藏字段。
https://stackoverflow.com/questions/15419055
复制相似问题