我在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和夹具有什么问题?或者我应该使用迁移吗?
答案 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