#ruby-on-rails
Вопрос:
Мой проект позволяет пользователям создавать супергероя и связывать его с командой, используя вложенные атрибуты. Проблема в том , что если команда была ранее создана и зарегистрирована collection_check_boxes
, «Создать новую команду» text_field
все равно потребует от пользователей ввода и ввода новой команды. Другими словами, я продолжаю получать сообщение об ошибке, которое text_field
нельзя оставлять пустым независимо от того, проверяет ли пользователь один или несколько полей в поле collection_check_boxes
.
Я хочу validates_presence_of :name
запустить, если команда :name
уже существует в collection_check_boxes
. Если его нет в флажках, выполните проверку в :name
text_field
Я перепробовал много шагов и до сих пор не могу понять этого. Мое лучшее предположение состоит в том, что мне нужно создать собственный метод, чтобы это сработало. Вот скриншот моего проекта: https://i.stack.imgur.com/R3puR.png
супергерой.рб
class Superhero < ApplicationRecord
belongs_to :user
has_many :superhero_teams
has_many :teams, through: :superhero_teams
validates_presence_of :name
accepts_nested_attributes_for :teams, reject_if: proc { |attributes| attributes['name'].blank?}
def teams_attributes=(team_attributes)
team_attributes.values.each do |team_attribute|
team = Team.find_or_create_by(team_attribute)
self.teams << team
end
end
end
команда.рб
class Team < ApplicationRecord
has_many :superhero_teams
has_many :superheroes, through: :superhero_teams
validates_presence_of :name
end
новый.html.erb
<h1>CREATE A SUPERHERO</h1>
<%= form_for(@superhero) do |f| %>
<%= render partial: "layouts/error", locals: {object: @superhero} %>
<div class="field">
Superhero Name
<%= f.text_field :name %>
<br>
<br>
</div>
<div class="field">
<% if Team.exists? %>
Select Team:
<%= f.collection_check_boxes :team_ids, Team.all, :id, :name %>
<br><br>
<% end %>
</div>
<div class="field">
Create a new Team:
<%= f.fields_for :teams, @superhero.teams.build do |teams_fields| %>
<%= teams_fields.text_field :name %>
<% end %>
</div>
<div class="actions">
<br>
<%= f.submit %>
</div>
<% end %>