创建一个对象,并从不同的模型为其分配一个关联的对象

时间:2015-05-12 10:16:10

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord crud

我的数据库中有工具和项目。项目属于工具&一个工具有一个项目。我的数据库中已经有很多工具了。

创建项目时,我希望能够为其分配工具。棘手的是,工具由数据库中的tool_id引用,而用户只知道工具的名称。

因此,当我创建一个项目时,我希望能够传入一个tool_name,然后以某种方式找出哪个工具并使用分配给它的正确工具创建项目。

到目前为止,这是我的代码,因为你可以看到它不起作用。当我在我的新项目表单中使用tool_name但我强大的params期望tool_id而不是tool_name

你会如何解决这个问题?

我有一张表格

<%= form_for [@project], :html => { :multipart => true } do |f| %>
<div class="form-group">
   <%= f.label :name %><br>
   <%= f.text_field :name, class:'form-control' %>
</div>
<div class="form-group">
   <%= f.label :tool_name %><br>
   <%= f.text_field :tool_name, class:'form-control' %>
</div>

在我的项目控制器中,我有以下创建方法和强参数

def create
    @project = Project.new(project_params)
end

private

def project_params
    params.require(:project).permit(:name, :tool_id)
end

我的项目表如下:

create_table "projects", force: :cascade do |t|
    t.string  "name"
    t.integer "tool_id"
end

我的工具表:

create_table "tools", force: :cascade do |t|
    t.string  "tool_name"
end

在我的项目模型中,我有:belongs_to :tool 在我的工具模型中,我有:has_one :project

1 个答案:

答案 0 :(得分:0)

我会提供一个下拉菜单,而不是可用的工具。类似的东西:

<%= f.collection_select(:tool_id, Tool.all, :id, :name) %>

如果工具列表很大,您可能最好使用自动填充功能,但这取决于您的应用程序。