不保存在rails form_for中的新列

时间:2014-02-16 02:32:57

标签: ruby-on-rails ruby forms sqlite

我正在使用rails创建在线商店应用程序,当用户处理订单时,我最初使用列创建了一个订单支架:

  • :name,:text
  • :地址,:text_field
  • :电子邮件,:电子邮件

此工作正常,表单将提交,所有数据都将添加到数据库中。但是我想在数据库中添加两个新列,即delivery_date和delivery_time,因此我创建了一个迁移并通过

添加了它们。
  • add_column:orders,:delivery_date,:text
  • add_column:orders,:delivery_time,:text

接下来我进入了_form partial并在form_for方法中添加了新行,现在看起来像

<div class="field">
  <%= f.label :delivery_date %>
  <%= f.text_area :delivery_time %>
</div>

但是当表单加载并且我将信息输入这两个新字段时,它不会保存到数据库中,当我使用sqlite3从订单中选择*时我得到

id = 1
name = name entered
address = address entered
email = email entered
delivery_date = 
delivery_time =

我不知道是否必须在其他地方添加这些列信息?感谢

4 个答案:

答案 0 :(得分:6)

在控制器中,您需要允许通过参数传递这些属性。寻找名为order_params的方法。

答案 1 :(得分:3)

在rails控制器类中,在处理表单提交的方法中,您是否使用将提交的值绑定到ActiveRecord对象的安全方法?例如,如果您执行以下操作:

def create
    @person = Person.new(person_params)
    @person.save
end

def person_params
    params.require(:person).permit(:name, :address, :email)
end

然后,您只需将其他参数名称添加到允许的参数名称列表中。例如:

def person_params
    params.require(:person).permit(:name, :address, :email, :delivery_date, :delivery_time)
end

答案 2 :(得分:0)

如果您不使用rails 4,则很可能需要将其添加到attr_accessible。

attr_accessible name, address, ... , delivery_date, delivery_time

答案 3 :(得分:0)

您需要了解在Rails4中引入的strong parameters概念来解决您的问题。

它使您可以有意识地选择允许在数据库中进行批量更新的属性。 在您的情况下,当您使用3个属性scaffold生成name, address and email订单时,rails生成器会在order_params中为您创建一个现成的私有OrdersController方法并允许这些方法属性为你。

但是当您使用2个新属性生成迁移时,rails生成器只是为您创建一个迁移文件,而不是使用这两个新属性为您更新order_ params方法。如果您希望在数据库中更新这两个属性delivery_date and delivery_time,那么只需在order_params方法中允许它们。这应该可以解决你的问题。