Рельсовые ассоциации и формы - PullRequest
5 голосов
/ 09 января 2011

У меня есть модель под названием appointment.Каждый appointment имеет stylist.В форме, где я создаю новый appointment, я делаю это:

  <div class="field">
    <%= f.label :stylist_id %><br />
    <%= f.select(:stylist_id, Stylist.order("name").map { |s| [s.name, s.id] }) %>
  </div>

Это работает, но будет утомительно делать подобные вещи для каждой ассоциации в моем приложении.Я предполагаю, что в Rails есть какой-то способ автоматической генерации полей выбора для ассоциаций, но я понятия не имею, как это работает.Существует ли такая вещь?

О, и, кстати, я уже знаю о строительных лесах.Если предполагается, что строительные леса позаботятся о том, что я описал выше, я, очевидно, что-то делаю не так, потому что это не делает для меня.

Ответы [ 3 ]

23 голосов
/ 29 октября 2012

Хм, похоже, что collection_select будет работать для типичного сценария:

<%= f.collection_select :stylist_id, Stylist.all, :id, :name %>
4 голосов
/ 09 января 2011

Насколько правильный ответ RobinBrouwer, я просто хотел поделиться небольшим слепком, который я придумал для одного из наших приложений на работе:

# config/initializers/to_options.rb
module ActiveRecord
  class Base
    def self.to_options(title=:name)
      self.all.map{|r| [r.send(title), r.id]}
    end
  end
end

Теперь вы можете использовать to_options на любой модели, с возможностью выбора любого поля для текста опции (по умолчанию name).

Model.to_options # => Creates select options with [m.name, m.id]
AnotherModel.to_options(:title) # => Creates select options with [m.title, m.id]

Не должно быть сложно изменить порядок при необходимости.

1 голос
/ 09 января 2011

Насколько я знаю, в Rails нет более простого способа создания тегов выбора. Вы можете использовать гем типа formtastic (https://github.com/justinfrench/formtastic) или simple_form (https://github.com/plataformatec/simple_form),), который облегчает создание форм. Я сам предпочитаю simple_form, поэтому я бы посоветовал вам попробовать это.

Другим способом является создание собственного помощника выбора, который автоматически получает связанные записи из базы данных. Вы также можете поместить Stylist.order... вещи внутри модели:

# Model
def self.select
  Stylist.order("name").map { |s| [s.name, s.id] }
end

# Form
<%= f.select(:stylist_id, Stylist.select) %>

Делает ваш взгляд немного приятнее. :)

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