Как я могу сделать поле опций из другой таблицы базы данных в рельсах? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть модель Responsibility с одним текстовым полем ответственности. Другая модель - Stage, в поле формы Stage есть text_field responsibility Я хочу отобразить список опций из таблицы responsibilities, как я могу это сделать в рельсах?

маршрутов. rb

  resources :projects do
    resources :responsibilities
    resources :stages
  end

stage _form. html .erb

<%= form_with(model: stage, url: [@project, stage], local: true) do |form| %>

  <div>
    <%= form.label :responsibility, :class=>"required" %>
    <%= form.text_field :responsibility %>
  </div>


  <div>
    <%= form.submit %>
  </div>

<% end %>

Как отобразить список обязанностей в качестве опции в поле формы ответственности этапа?

что такое попытался:

stage _form. html .erb

  <div>
    <%= form.label :responsibility %>
    <%= select_tag "colors", @responsibilities , multiple: true %>
  </div>

stage_controller.rb

  def new
    @stage = Stage.new
    @project = Project.find(params[:project_id])
    @responsibilities = @project.responsibilities
  end

Я не смог отрисовать форму, но в поле ответственности нет ни одного из ответственность была доступна как опция.

1 Ответ

2 голосов
/ 05 февраля 2020

select_tag принимает в качестве строки второго параметра, который содержит параметры в виде строки. Rails предоставляет некоторые вспомогательные методы, которые полезны для генерации этих <option> тегов

options_from_collection_for_select , options_for_select

Если вы проверяете с разработчиком своего браузера Инструменты html код тега <select> вы увидите что-то вроде этого:

<select name="colors[]" id="colors" multiple="multiple">
#&lt;Responsibility::ActiveRecord_Relation:0x00007f3f72cc7eb0&gt;
</select>

Это потому, что select_tag вызывает to_s метод @responsibilities collection.

правильный способ создания select_tag будет выглядеть примерно так:

<%= select_tag "colors", options_from_collection_for_select(@responsibilities, :id, :name) , multiple: true %>

Существует другой способ создания поля выбора с использованием метода FormBuilder collection_select . Это может выглядеть примерно так:

  <div>
    <%= form.label :responsibility %>
    <%= form.collection_select :responsibility, @responsibilities, :id, :name, prompt: true %>
  </div>

Надеюсь, этот ответ будет полезен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...