Я новичок в рельсах, и я не уверен, как настроить комбинированный список, чтобы он мог отображаться в браузере как «необходимый».У меня есть Product
и Location
, и в продукте должно быть указано местоположение:
class Product < ApplicationRecord
belongs_to :location
validates :location, presence: true
end
class Location < ApplicationRecord
has_many :products
end
В моей новой форме продукта есть помощник, который показывает, что поле является обязательным, но яЯ не уверен, как лучше сделать это с этим связанным местоположением.Когда я пытаюсь сопоставить его с атрибутом :location
следующим образом:
<%= form_for @product do |f| %>
<%= show_label f, :location %>
<%= f.collection_select :location, @locations, :id, :name, include_blank: true %>
<%= f.submit %>
<% end %>
# helper
def show_label(f, attr)
required = f.object.class.validators_on(attr)
.any? { |v| v.kind_of?(ActiveModel::Validations::PresenceValidator) }
label = attr.to_s + required ? '*' : ''
label
end
... помощник show_label
правильно видит, что требуется :location
, но сама модель не может выполнить проверку послеформа размещена, потому что местоположение здесь - это строка (идентификатор: местоположения), а не фактический Location
.
Когда я вместо этого использую :location_id
:
<%= f.collection_select :location_id, @locations, :id, :name, include_blank: true %>
затем show_label
не видит, что :location_id
является обязательным атрибутом, поэтому я не получаю обязательную аннотацию поля, , но местоположение сохраняется правильно при сохранении модели.
Чтоправильный способ визуализации комбинированного списка, чтобы я мог одновременно определить, является ли это обязательное поле И позволить моему контроллеру сохранить мой продукт?Я чувствую, что, возможно, я упускаю что-то, что все компетентные люди из Rails просто знают.