Rails - 为模型添加新属性,值不保存

时间:2015-12-11 14:48:59

标签: ruby-on-rails ruby

我和这个问题的症状相同:

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>

2 个答案:

答案 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'