【问题标题】:Correct way to construct view when using nested attributes使用嵌套属性时构造视图的正确方法
【发布时间】:2019-01-22 13:17:38
【问题描述】:

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

我有以下模型:项目、用户和授权用户

每个项目都有一个允许访问的授权用户列表,授权用户的选择是从项目编辑视图中所有用户的下拉选择列表中进行的。 我热衷于尽可能多地利用 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 集合,手动更新相关记录?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    这比您尝试做的要容易。

    您不需要在 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: [] 添加到允许的参数,并从第一个实现中删除任何未使用的参数。

    【讨论】:

    • 谢谢 - 这看起来很有帮助,我会尝试这种方法。作为旁注 - 这个答案包含我在 Rails 中难以理解的事情之一 - collection_select 中的第一个参数是 ':user_ids' (带有前导冒号),而将 user_ids 声明为允许的参数是'user_ids: []'(即尾随冒号和数组)。有人可以解释为什么对两者使用相同的“user_id”声明是不合适的吗?谢谢
    • @David,你不能在控制器中使用:user_ids,因为你需要在允许的参数中明确指定数组。符号params.require(:project).permit(:title, user_ids: []) 只是告诉“project 键必须在参数中(否则你会得到错误),并且在它的值内我们只接受 2 个参数,哪些键是 titleuser_ids,值user_ids是数组,不要把它当成字符串"
    • 如果我的回答有问题,请随时在此处发表评论,如果一切顺利,请接受:)
    猜你喜欢
    • 2019-04-18
    • 2016-10-16
    • 2022-07-26
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 2020-08-08
    • 2012-12-10
    • 1970-01-01
    相关资源
    最近更新 更多