2014-09-13 1 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 %> 

Вышеупомянутое, кажется, создает выпадающее меню, в котором я нуждаюсь. Я просто не знаю, как получить от: имя, сгенерированное в раскрывающемся списке, к: user_id, связанному с ним, чтобы отправить.

Поблагодарите вашу помощь.

Спасибо!

ответ

3

Frist следует использовать в качестве единственного числа object в collection_select:

<%= 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> 

Параметры имеют идентификаторы пользователей в value на эти имена, как содержание. Таким образом, параметр

params[:goal][:user_id] 

содержит идентификатор выбранного пользователя. Именно так Rails ожидает внешний ключ.

Смотрите документацию collection_select

ADITION: есть большие драгоценные камни, чтобы упростить генерацию формы, т.е. simple_form, который уменьшает форму

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

Спасибо, это фиксированная моя проблема. Все еще действительно новый для рельсов, и попытается пройти документацию. – user3515316

2

Ваш вопрос уже ответил, но я хотел бы поделиться удивительный учебник я нашел:

Advanced forms

Просто добавить в свой 'новый' контроллер

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

Затем в форме:

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

oh wow, который выглядит намного чище. Большое спасибо, что поделились! – user3515316

+0

Я искал это со вчерашнего дня спасибо –

Смежные вопросы