#ruby-on-rails #forms #checkbox #has-many-through
#ruby-on-rails #формы #флажок #имеет много сквозных
Вопрос:
Возможно ли сгенерировать несколько строк в таблице объединенной модели, используя new_form из exercise? Код работает только при создании одного упражнения, которое ссылается на body_section, а затем выбирает существующую мышцу.
Я попытался изменить код, чтобы использовать check_box, но не удалось
Исходный код
упражнение.модель
has_many :body_sections
has_many :muscles, through: :body_sections
accepts_nested_attributes_for :body_sections
end
muscle.model
has_many :body_sections
has_many :exercises, through: :body_sections
body_section.model
belongs_to :muscle
belongs_to :exercise
accepts_nested_attributes_for :exercise
end
контроллер упражнений
def new
@exercise = Exercise.new
@exercise.body_sections.build
@muscles = Muscle.all
end
# private method for strong parameter
params.require(:exercise).permit(:name, :note, :body_sections_attributes => [:name, :muscle_id])
Изменено для check_box
упражнение _form.view
<div>
<%= exercise_form.label :name, "Exercise Name" %>
<%= exercise_form.text_field :name %>
</div>
<div>
<%= exercise_form.fields_for :body_sections do |body_form| %>
<%= body_form.label :name, "Body Section Common Name" %>
<%= body_form.text_field :name %>
<br>
<%= body_form.collection_check_boxes(:muscle_ids, @muscles, :id, :name) do |c| %>
<%= c.label { c.check_box } %>
<% end %>
<% end %>
</div>
контроллер упражнений
# private method for strong parameter
params.require(:exercise).permit(:name, :note, :body_sections_attributes => [:name, :muscle_ids => []])
Я получаю ошибку `muscle_ids» неопределенного метода
по-видимому, у body_section нет методов muscle_ids, которые принадлежат ему. Как я должен изменить код, чтобы иметь возможность использовать checkbox для выбора и создания нескольких строк в body_sections одновременно??
Ответ №1:
С одной частью тела может быть связана только одна мышца.
Я бы использовал cocoon для создания динамических вложенных полей для добавления / удаления разделов тела.
И тогда вместо collection_check_boxes :muscles_ids
я бы использовал body_form.select options_from_collection(@muscles)
.
Мне казалось бы более логичным, что:
Exercise has many ExerciseMuscles
ExerciseMuscles belongs to Exercise
ExerciseMuscles belongs to Muscle
Muscle belongs to BodySection
BodySection has many muscles
Таким образом, вы создаете свои мышцы / секции тела, а затем люди связывают, какие мышцы используются в упражнении в форме (таким образом, у вас также есть доступ к упражнению, имеющему много секций тела (через мышцы)).