我和这个问题的症状相同:
Changes in a model not saving. Rails 4.1
关于强参数并且不允许参数中的新属性,那里唯一的建议(以及接受的答案,因为它解决了这个问题)是我犯过的第一个错误。我通过将它添加到参数中来解决这个问题。然后我注意到我添加的列名是" type",这显然是一个保留字。所以我也通过将其重命名为" assessmenttype"来解决这个问题,但它仍然没有保存该值。我知道传递给" new"的@assessment对象中存在的值。页面,因为我可以从那里打印@assessment.assessmenttype
,它匹配。但是,当"创建"时,不会被推送到数据库。做@assessment.save
行动。
assessments_controller.rb:
def new
...
@assessment = current_user.assessments.build
@assessment.name = params[:name]
@assessment.assessmenttype = params[:assessmenttype]
respond_with(@assessment)
end
def create
@assessment = current_user.assessments.build(assessment_params)
@assessment.save
...
end
...
def assessment_params
params.require(:assessment).permit(:name, :assessmenttype)
end
除了该问题中接受的答案之外,是否还有其他任何建议,为什么会发生这种情况?我明显遗漏了一些显而易见的东西,盯着它看了几个小时不让我看到!
评估表架构:
CREATE TABLE "assessments" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"name" varchar(255),
"created_at" datetime,
"updated_at" datetime,
"user_id" integer,
"assessmenttype" varchar(255)
);
用于调用" new"的链接示例方法:
<%= link_to 'Assess me', new_assessment_path(:name => qt.name,
:tid =>qt.id, :assessmenttype => "qt"),
class: "btn" %>
调用Assessment.new并从控制台保存记录的示例:
irb(main):006:0> a=Assessment.new(name:"one", user_id:1, assessmenttype:"qt")
=> #<Assessment id: nil, name: "one", created_at: nil, updated_at: nil, user_id: 1, assessmenttype: "qt">
irb(main):007:0> a.save
(0.0ms) begin transaction
D, [2015-12-11T16:07:51.875496 #2296] DEBUG -- : (0.0ms) begin transaction
SQL (1.0ms) INSERT INTO "assessments" ("assessmenttype", "created_at", "name", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?)
[["assessmenttype", "qt"], ["created_at", "2015-12-11 16:07:51.877496"], ["name", "one"], ["updated_at", "2015-12-11 16:07:51.877496"], ["user_id", 1]]
D, [2015-12-11T16:07:51.882582 #2296] DEBUG -- : SQL (1.0ms) INSERT INTO "assessments" ("assessmenttype", "created_at", "name", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?) [["assessmenttype", "qt"], ["created_at", "2015-12-11 16:07:51.877496"], ["name", "one"], ["updated_at", "2015-12-11 16:07:51.877496"], ["user_id", 1]]
(4.0ms) commit transaction
D, [2015-12-11T16:07:51.894498 #2296] DEBUG -- : (4.0ms) commit transaction
=> true
irb(main):008:0>
答案 0 :(得分:1)
您确定自己在视图表单中包含了一个隐藏字段,即该参数吗?
<%= f.hidden_field :assessmenttype %>
如果您没有在视图中显示该字段,则在发布时传回的参数不会包含它,即使您首先使用它来构建对象。 HTTP是无状态协议,我们每次都创建新对象。
答案 1 :(得分:0)
在新方法中,您使用的是@assessment.assessmenttype = params[:type]
但是,assessment_params
不允许type
,而是:assessmenttype
将新方法更改为以下内容:
def new
...
@assessment = current_user.assessments.build
@assessment.name = params[:name]
@assessment.assessmenttype = params[:assessmenttype]
respond_with(@assessment)
end
<强>更新强>
你在评论中说过它的传入(并提供了一个url字符串)。 url字符串应该是......
http://localhost:3000/assessments/new?name=Assessment+name&tid=1&assessmenttype=qt
...不
http://localhost:3000/assessments/new?name=Assessment+name&tid=1&type=qt
....因为这是你在assessment_params
中允许的参数的名称。
您有两种选择:
1 - 如果要保留现有参数字符串,可以将:type
添加到允许的参数列表中。仅此部分应该允许您的代码工作。
2 - 更改即将进入的参数的名称。如果来自表单,则表单输入应链接到&#39; assessmenttype&#39;。如果它的代码应该是params[:assessmenttype] = 'qt'