首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails -如何在表单上使用隐藏字段来传递与表单上创建的对象相关的值?

Rails -如何在表单上使用隐藏字段来传递与表单上创建的对象相关的值?
EN

Stack Overflow用户
提问于 2013-03-15 04:00:51
回答 2查看 14.8K关注 0票数 4

我正在尝试从一个表单传递一个rfid_tag,该表单从hidden_field创建device。Device has_many rfids。该rfid已存在于数据库中。

下面是表单中的代码:

代码语言:javascript
复制
<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中的代码:

代码语言:javascript
复制
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的一个属性

代码语言:javascript
复制
Can't mass-assign protected attributes: rfid_tag

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-15 04:17:30

由于您正在将:rfid_tag作为params[:device]属性散列的一部分进行传递,因此会发生批量分配错误。

在示例代码中,需要使用hidden_field_tag表单帮助器提供:rfid_tag字段。这将使它不会被包含在params[:device]散列中。

代码语言:javascript
复制
<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方法应该仍然有效。

票数 7
EN

Stack Overflow用户

发布于 2013-03-15 04:34:25

照Dan Reedy说的做,在你的表单中使用hidden_field_tag。

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

代码语言:javascript
复制
@device.rfids << Rfid.where('rfid_tag' => params[:rfid_tag]).first

如果您的rfid也有许多设备,那么这很好,因此您有一个多对多的关系。但是,如果rfid标签只与一个设备一起使用,那么您可能需要将其更改为以下内容:

代码语言:javascript
复制
rfid = Rfid.where('rfid_tag' => params[:rfid_tag]).first
rfid.device_id = @device.id
rfid.save!

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15419055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档