使用嵌套属性时正确的构造视图的方法

时间:2019-01-22 13:17:38

标签: ruby-on-rails

我难以理解应该如何构建视图以确保项目模型的更新也能更新相应的相关记录

我有以下模型:项目,用户和AuthorizedUser

每个项目都有一个允许访问的授权用户列表,并且可以从项目编辑视图中所有用户的下拉列表中选择授权用户。 我热衷于尽可能多地使用Rails的“魔术”,所以我的理解是,为了使project.update方法能够处理为项目保存authorized_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的一部分隐式完成,还是必须在项目控制器中迭代遍历authorized_users的集合,以手动更新相关记录?

1 个答案:

答案 0 :(得分:3)

它比您尝试做的要容易。

您不需要在Project模型中使用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: []并从第一个实现中删除所有未使用的参数。