Ruby on rails 如何在RubyonRails3中通过表单输入设置外键?

Ruby on rails 如何在RubyonRails3中通过表单输入设置外键?,ruby-on-rails,ruby,forms,input,key,Ruby On Rails,Ruby,Forms,Input,Key,在我的新Rails应用程序中(这是我的第一个!),用户可以管理他们的客户机,还可以为每个客户机创建项目 用户------

在我的新Rails应用程序中(这是我的第一个!),用户可以管理他们的客户机,还可以为每个客户机创建项目

用户------<客户------<项目

为了为客户端创建新项目,用户必须从如下选择框中选择客户端:

<%= f.label :client_id %>
<% options = current_user.clients.all.map { |client| [client.name, client.id] } %>
<%= f.select(:client_id, options) %>
client = current_user.clients.find(params[:project][:client_id])
@project = client.projects.build(params[:project])
这很有效,但我觉得直接将客户id放入我的表单中不是特别好。在我的项目模型中,它甚至说:

attr_accessible :name, :client_id

那么这是一个安全缺陷吗?我不想让任何人篡改这些外键。有没有一种更安全的方法来设置Rails中的外键?

因此Rails提供了一系列非常好的表单帮助程序。看看这个:

此方法将生成您要查找的内容。回答你的问题,没有人能真正篡改这些ID

如果您愿意让用户为项目选择一个客户机,那么最糟糕的情况是,您与一个与该项目无关的客户机有一个额外的项目

下面是我如何做你想要的:

<%= f.select :client_id, options_from_collection_for_select(current_user.clients.all, 'id', 'name') %>

这些方法首先获取collecton(在您的情况下是当前的_user.clients.all),然后获取选项值的属性(在您的情况下是id),然后获取label属性(在您的情况下是客户端的名称)


您需要
attr\u accessible:client\u id
是正确的,但正如我所说的,这确实不是一个安全问题

所以Rails有很多很好的表单助手来帮助这类事情。看看这个:

此方法将生成您要查找的内容。回答你的问题,没有人能真正篡改这些ID

如果您愿意让用户为项目选择一个客户机,那么最糟糕的情况是,您与一个与该项目无关的客户机有一个额外的项目

下面是我如何做你想要的:

<%= f.select :client_id, options_from_collection_for_select(current_user.clients.all, 'id', 'name') %>

这些方法首先获取collecton(在您的情况下是当前的_user.clients.all),然后获取选项值的属性(在您的情况下是id),然后获取label属性(在您的情况下是客户端的名称)


您需要
attr\u accessible:client\u id
是正确的,但正如我所说的,这确实不是一个安全问题

好的,非常感谢!很高兴知道我在这里是安全的。好的,非常感谢!很高兴知道我在这里是安全的。