使用带有 Rails 的改革 gem,我如何填充 has_many :通过嵌套模型

Posted

技术标签:

【中文标题】使用带有 Rails 的改革 gem,我如何填充 has_many :通过嵌套模型【英文标题】:Using the reform gem with Rails, how do I populate a has_many :through nested model 【发布时间】:2016-08-22 09:22:59 【问题描述】:

我有一个用户模型和角色模型,通过以下方式在 ActiveRecord 中连接:

has_many roles, through: :role_accounts

我想要一个“编辑用户”屏幕,其中包含一个复选框列表,每个角色一个复选框。使用改革 gem (v2.1.0),这是表单对象的 sn-p:

class UserForm < Reform::Form
  property :name
  collection :roles do
    property :id
  end
end

我的问题是,当提交编辑表单并检查 2 个角色时,参数哈希看起来像:"user=&gt;"name"=&gt;"Joe","roles"=&gt;["2","5",""],我收到此错误:

[Reform] Your :populator did not return a Reform::Form instance for `roles`.

如何为 has_many through 设置填充器?

另外,我想我首先需要删除所有用户的角色,然后添加选定的角色,这样他们就只剩下当前的一组角色了。如何使用改革宝石做到这一点?

【问题讨论】:

【参考方案1】:

由于 Reform 不知道角色是什么,因此您必须填充它并告诉它角色是什么模型。 以下是指南中的示例:

collection :songs,
  populator: ->(fragment:, **) 
    # find out if incoming song is already added.
    item = songs.find  |song| song.id == fragment["id"].to_i 

    item ? item : songs.append(Song.new)
  

【讨论】:

以上是关于使用带有 Rails 的改革 gem,我如何填充 has_many :通过嵌套模型的主要内容,如果未能解决你的问题,请参考以下文章

Rails 5,带有 Select2-rails 的简单表单

带有 Docker 的 Rails '在任何资源中都找不到 ...' 用于现有的 gem

如何使用Rails中的Mobility gem以一种形式实现所有翻译? [关闭]

使用带有 bootstrap-sass gem 的 Rails 4 无法让 CSS 在 Heroku 上工作

带有 websocket_rails gem 的 rails 应用程序中的方法 broadcast_message 不起作用

带有docker的Gitlab runner不会在本地缓存rails gem