2014-09-13 37 views
0

我是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来提交它。

非常感谢您的帮助。

谢谢!

回答

3

弗里斯特你应该collection_select用单数object

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

然后你collection_select创建select标签与名称goal[user_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> 

的选项有用户ID为value的名称作为内容。所以参数

params[:goal][:user_id] 

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

collection_select

ADITION的文档:有很大的宝石,以简化的形式产生,即simple_form从而降低您的形式

<%= simple_form_for(@goal) do |f| %> 
    ... 
    <%= f.association :user %> 
<% end %> 
+0

谢谢,这个固定我的问题。对于rails还是很新的,并且会尝试通过文档。 – user3515316 2014-09-13 13:36:40

2

你的问题已经回答了,但我想与大家分享一个真棒教程中,我发现:

Advanced forms

刚添加到您的 '新' 控制器

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

然后在您的形式:

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

哦,哇,看起来更清洁。非常感谢你的分享! – user3515316 2014-09-14 17:24:47

+0

自昨天起我一直在寻找这个谢谢你 – 2015-02-12 19:59:41

相关问题