当用户从下拉菜单中选择名称时,在表单中保存外键

时间:2014-09-13 10:40:16

标签: ruby-on-rails drop-down-menu erb

我是Ruby on Rails的新手,我很难过。作为练习的一部分,我正在创建一个应用程序,让人们将目标,描述,截止日期分配给一个人。

我有两个模型,一个用户模型和一个目标模型。在我的ERB表单中创建了一个新目标,我创建了一个包含所有已创建用户的下拉菜单,但现在我不知道如何将其转换为保存的外键。

<%= form_for(@goal) do |f| %>
  <% if @goal.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@goal.errors.count, "error") %> prohibited this goal from being saved:</h2>

......

    <div class="field">
       <%= f.label :user_id, "Whose goal is it?" %><br>
       <%= collection_select(:goals, :user_id, User.all, :id, :name, prompt: true ) %>
    </div>

  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

以上似乎创建了我需要的下拉菜单。我只是不知道如何从下拉列表中生成的:name与之关联的:user_id来提交。

非常感谢您的帮助。

谢谢!

2 个答案:

答案 0 :(得分:3)

首先,你应该在object中使用单数作为collection_select

<%= collection_select(:goal, :user_id, User.all, :id, :name, prompt: true ) %>

然后,您的collection_select会创建一个名为select的{​​{1}}代码。它看起来像

goal[user_id]

选项的用户ID为 <select name="goal[user_id]"> <option value="">Please select</option> <option value="1" selected="selected">D. Heinemeier Hansson</option> <option value="2">D. Thomas</option> <option value="3">M. Clark</option> </select> ,名称为内容。所以参数

value

包含所选用户的ID。这正是Rails期望外键的方式。

请参阅collection_select

的文档

Adition:有很棒的宝石来简化表单生成,即params[:goal][:user_id] 将表单缩小为

simple_form

答案 1 :(得分:2)

您的问题已经得到解答,但我想分享一个很棒的教程:

Advanced forms

只需添加到“新”控制器

即可
@user_options = User.all.map{|u| [ u.name, u.id ] }

然后以你的形式:

 <%= f.select(:user_id, @user_options) %>