0

大多数情况下,我在seeds.rb 中的条目都很简单,如下所示:

User.create!(
name: "Peter"
admin: false;
# etc.
)

如果我收到“无法批量分配受保护的属性”错误,我会在模型中进行一些小的更改,在本例中为 user.rb:

attr_accessible: name, admin

到现在为止还挺好。但是我应该如何将条目播种到由 rails gem 生成的表中,从而为我的应用程序添加另一个引擎?例如,前锋。我敢肯定还有其他人。

我已将这些条目添加到我的seeds.rb 文件中:

Forem::Category.create!(
name: "cat1"
)

Forem::Forum.create!(
title: "forum1",
description: "forum1 description",
category_id: 1
)

Forem::Topic.create!(
forum_id: 1,
user_id: 1,
subject: 'topic1',
locked: false,
pinned: false,
hidden: false,
)

类别和论坛已生成,主题不是:

Can't mass-assign protected attributes: forum_id, user_id, locked, pinned, hidden

如果我有一个 topic.rb 模型,我会知道该怎么做。但我没有。Forem 是一个引擎,我不知道如何使模型 topic.rb 的某些属性可见。

我知道application.rb中的这一行:

config.active_record.whitelist_attributes = true

启用防止批量分配的保护。禁用它会留下一个巨大的安全漏洞,所以它不是一个选择。并且禁用它无论如何都不允许我进入主题表。

我也尝试过使用固定装置。我将此添加到我的seeds.rb 文件中:

require 'active_record/fixtures'
Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "topics.yml")

测试/topics.yml:

one:
  id: 1
  forum_id: 1
  user_id: 1
  subject: "topic1"
  created_at: 2012-05-19 19:54:19
  updated_at: 2012-05-19 19:54:20
  locked: false
  pinned: false
  hidden: false
  last_post_at: 2012-05-19 19:54:21
  state: "open"
  views_count: 3

我得到的错误是 -未初始化的常量 Fixtures

我的seeds.rb 和fixture 有什么问题?或者我应该使用迁移?

4

2 回答 2

2

禁用它会留下一个巨大的安全漏洞,所以它不是一个选项`

不,这不是一个巨大的安全漏洞。这是一个有争议的辩论,但是attr_accessible(和变体)(在我和许多其他人看来)不是一个很好的解决方案,可以解决阻止用户创建/更新他们不应该创建/更新对象/属性的问题。换句话说,attr_accessible是控制器问题的模型解决方案。因为这是控制器的工作,以确保数据被清理和可用,检查当前用户是否被允许做这样的事情,等等。

所以我要做的是删除所有对的引用attr_accessible并将其设置whitelist_attributes为false。

然后由您在控制器中过滤参数。您可以按照本要点中的操作或使用rails/strong_parameters或任何其他可能让您满意的方式。

之后,您在播种时将不再遇到这些问题

于 2012-05-24T17:31:09.440 回答
1

Seeds.rb 只是 ruby​​ 代码。您不必在一行中创建整个资源。尝试这样的事情

topic = Forem::Topic.create(
  :subject => "topic 1",
  :locked => false
  # etc
)

topic.user_id = 1
topic.save
于 2012-05-24T17:28:41.087 回答