如何从传递回控制器的视图中呈现的数据中获取 Active Record id (Rails)

How to get Active Record id from data rendered in view passed back to the controller (Rails)

我正在开发一个 Rails 4.1.9 应用程序,它具有三种模型——用户、设备和用户设备。在视图中,有一个 each 循环来显示属于用户的所有设备的 table(我们使用 slim 而不是 erb,所以这是 HTML):

- @user.devices.each do |device|
  tr
    td= device.id
    td= device.name
    td= device.device_type

我的任务是添加一种在单击删除按钮时删除 UserDevice 关联的方法,因此我添加了以下代码:

可见:

td= link_to "Clear device", [:clear_device, :admin, @business, @user], method: :delete, class: 'btn btn-flat danger' 

在控制器中:

def clear_device
  device = UserDevice.where(user_id: params[:id])
  device.destroy_all

  redirect_to admin_business_user_path
end

我 运行 遇到的问题是,当我查询与 user_id 匹配的设备时,可能会有多个设备,这就是为什么我必须使用 [=28= 】,虽然我只想毁掉一个。我需要的是将 table 中第一列的 id 传回控制器,以便我可以查询 device_id 和 user_id,如下所示:

 def clear_device
   device = UserDevice.where(device_id: (id from view) AND user_id: params[:id])
   device.destroy

   redirect_to admin_business_user_path
 end

我似乎无法弄清楚如何从视图中的 table 获取该 ID 返回给控制器,有什么建议吗?我知道如果我要在表单中使用隐藏字段是可能的,但如果我实际上不将表单用于任何事情,那似乎不是最佳实践。我也不想引入任何 JavaScript 或 jQuery,但如果那是唯一的选择,我会引入。

你走在正确的轨道上,而且真的很接近。我不知道你的 routes.rb 长什么样,但我猜测你的路线设置方式,假设 params[:id] 映射到 user_id。您只需要使用包含 device_id 的 "Clear Device" 发送一个额外的参数。我对 slim 不太熟悉,所以这个语法可能不准确:

td= link_to "Clear device", admin_business_clear_device_path(id: @user.id, device_id: device.id), method: :delete, class: 'btn btn-flat danger

查看您的路线和路径助手,确定它是正确的 link 目的地。 ERB 看起来像这样:

<td><%= link_to "Clear Device", {:controller => :admin, :action => :clear_device, :id => @user.id, :device_id => device.id}, {:method => :delete, :class => 'btn btn-flat danger'} %></td>

有几种不同的写法,但您绝对应该能够传递一个额外的查询字符串参数:设备 ID。然后在你的控制器中,你可以通过访问 params[:device_id]:

来做你想做的
def clear_device
  device = UserDevice.where(device_id: params[:device_id] AND user_id: params[:id])
  device.destroy

  redirect_to admin_business_user_path
end

希望对您有所帮助。