Правильный способ построения представления при использовании вложенных атрибутов - PullRequest
0 голосов
/ 22 января 2019

У меня возникают трудности с пониманием того, как я должен построить свое представление, чтобы гарантировать, что обновление модели моего проекта также обновляет соответствующие связанные записи

У меня есть следующие модели: Project, User и AuthorisedUser

Каждый проект имеет список авторизованных пользователей, которым разрешен доступ, и выбор авторизованных пользователей осуществляется из раскрывающегося списка выбора всех пользователей в представлении редактирования проекта.Я стремлюсь использовать как можно больше "магии" Rails, поэтому я понимаю, что для того, чтобы метод project.update имел дело с сохранением коллекции authorised_users для проекта, мне нужны следующие ассоциации:

(Project Model)
has_many :authorised_users
has_many :users, through: :authorised_users
accepts_nested_attributes_for :authorised_users

(User Model)
has_many :authorised_users
has_many :projects, through: :authorised_users

(Authorised User Model)
belongs_to :project
belongs_to :user  

Что мне трудно понять, так это то, как построить мое представление таким образом, чтобы авторизованные пользователи (т.е. те, которые выбраны из списка всех пользователей) отображались так, как требуется в параметрах, представляемых контроллеру.Я думаю, что мне нужно как-то включить ссылку на модель AuthorisedUser, но я смог найти только примеры этого, где используется помощник fields_for, например:

  = project_form.fields_for :authorised_users do |auf|          
      - selected = @project.authorised_users
      = auf.label :user_id, 'Authorised Users'
      = auf.collection_select('authusers', User.all, :id, :username, {:prompt => 'Blah', :selected => selected}, {multiple: true, class: 'form-control'})

Хотя это приводит кпоявление authorised_user_attributes в параметрах контроллера, это не совсем верно, поскольку блок (очевидно) будет повторять выбор для каждого авторизованного пользователя - я просто хочу, чтобы появилось одно поле выбора, из которого выбранные пользователи могут быть сохранены как «авторизованные»против проекта

Возможно, это не так сложно, как мне кажется, но я был бы признателен за некоторую ясность в отношении лучшего подхода, например:

Может ли Rails сделать это бездействием как частьproject.update, или я должен перебирать коллекцию authorised_users в контроллере проекта, обновляя вручную связанные записи?

1 Ответ

0 голосов
/ 22 января 2019

Это проще, чем то, что вы пытаетесь сделать.

Вам не нужно accepts_nested_attributes_for :authorised_users в модели проекта, поскольку вы хотите только обновить user_ids. Следовательно, вам не нужно fields_for.

- selected = @project.authorised_users
= project_form.label :user_ids, 'Authorised Users'
= project_form.collection_select :user_ids, User.all, :id, :username, {:prompt => 'Blah', :selected => selected}, {multiple: true, class: 'form-control'})

Не забудьте добавить user_ids: [] к разрешенным параметрам и удалить все неиспользуемые параметры из первой реализации.

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