Как показать обязательное поле формы для объединения в рельсы? - PullRequest
0 голосов
/ 03 декабря 2018

Я новичок в рельсах, и я не уверен, как настроить комбинированный список, чтобы он мог отображаться в браузере как «необходимый».У меня есть 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 просто знают.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Существует связка из сообщений о различиях между проверкой ассоциации и проверкой столбца _id, но грубая идея должна заключаться в проверке_id столбец и ассоциация.

0 голосов
/ 03 декабря 2018

Попробуйте использовать validates :location_id, presence: true.Это не то же самое, что другая проверка (вы можете установить идентификатор, который не существует, он будет действительным, потому что он присутствует, но это будет недопустимое местоположение), поэтому оставьте проверку :location также.

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