Я до сих пор исправил проблему, которая у меня была ...
Когда я узнал о вложенных атрибутах, это было относительно просто!
Вот новая модель персонажей!
class Character < ActiveRecord::Base
belongs_to :user
has_many :player_skills
has_many :skills, :through => :player_skills
accepts_nested_attributes_for :player_skills
def skills_pre_update(params)
skills = Skill.find(:all, :order => 'id')
skills = skills.map do |skill|
skill.id
end
self.skill_ids = []
self.skill_ids = skills
self.skill_ids.each_with_index do |skill_id, index|
self.player_skills[index].level = params[:character][:player_skills_attributes][index][:level]
end
self.skill_ids = params[:character][:skill_ids]
end
end
А действие обновления для контроллера персонажа было слегка изменено:
@character.skills_pre_update(params)
params[:character].delete(:player_skills_attributes)
params[:character].delete(:skill_ids)
Причина в том, что эти две части уже обрабатываются действием pre_update, поэтому их не нужно снова обрабатывать update_attributes, который вызывается позже.
Вид был относительно прямым. флажки «многие ко многим» остаются прежними, однако я добавил новые текстовые поля!
- @skills.each_with_index do |skill,index|
= check_box_tag "character[skill_ids][]", skill.id, @character.skills.include?(skill)
=h skill.name
-ps = skill.player_skills.find_by_character_id(@character) || skill.player_skills.build
-fields_for "character[player_skills_attributes][]", ps do |psf|
=psf.text_field(:level, :index => nil)
=psf.hidden_field(:id, :index => nil)
По сути, причина, по которой я должен исключить skill_ids (skill_ids = []
) в модели персонажей, заключается в том, что в противном случае он неправильно устанавливает порядок.
По сути, я добавляю все навыки.
Обновите уровни, используя текстовые поля.
Затем сбросьте навыки до того, что пользователь фактически проверил (что удалит все неиспользуемые навыки.)
Я не чувствую, что это самое лучшее решение - на самом деле оно кажется мне довольно хакерским.
Так что, если кто-то еще хочет присоединиться к лучшему, возможно, более быстрому / более элегантному решению, не стесняйтесь!
В противном случае, я надеюсь, что это поможет кому-то еще ... потому что изменение дополнительных атрибутов в таблице соединений (без предоставления таблице соединений своих собственных контроллеров / представлений) было настоящей болью!