如何在Ruby on Rails中正确添加默认条目到数据库?

时间:2012-05-24 17:21:38

标签: ruby-on-rails ruby-on-rails-3

我在seeds.rb中的条目很简单,就像这样:

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

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

attr_accessible: name, admin

到目前为止一切顺利。但我怎么能把条目种子放入由rails gem生成的表中,这会为我的应用添加另一个引擎?例如Forem。而且我确定还有其他人。

我已将这些条目添加到我的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是engine,我不知道如何制作模型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

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

我的种子.rb和夹具有什么问题?或者我应该使用迁移吗?

2 个答案:

答案 0 :(得分:2)

  

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

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

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

然后由您来控制控制器中的params。您可以在this gist中完成,也可以使用rails/strong_parameters或其他任何可能让您满意的方式。

之后,播种时不再出现这些问题

答案 1 :(得分:1)

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

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

topic.user_id = 1
topic.save