"简单形式"数据未插入数据库

时间:2015-11-27 18:48:29

标签: ruby-on-rails forms sqlite model-view-controller simple-form

我有一个看起来像这样的表格

<%= simple_form_for @contact_form, url: contact_form_index_path, method: :post do |f| %>
    <%= f.input :first_name, placeholder: 'Jane' %>
    <%= f.input :last_name, placeholder: 'Doe' %>
    <%= f.input :email, placeholder: 'example@email.com' %>
    <%= f.input :address, placeholder: '123 Main Street' %>
    <%= f.input :city, placeholder: 'Pleasantville' %>
    <%= f.input :state, placeholder: 'NJ' %>
    <%= f.input :zip_code, placeholder: '12345' %>
    <%= f.input :phone, placeholder: '(123) 456-7890' %>
    <%= f.button :submit %>
<% end %>

我的数据库架构看起来像这样;

create_table "contact_forms", force: :cascade do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.string   "email"
    t.string   "address"
    t.string   "city"
    t.string   "zip_code"
    t.string   "state"
    t.integer  "phone"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

我的控制器如下所示;

class ContactFormController < ApplicationController
    def new
        @contact_form = ContactForm.new
    end

    def create
        @contact_form = ContactForm.new

        if @contact_form.save
            redirect_to pages_url
        else
            render :new
        end
    end
end

当我测试表单并尝试将输入的数据发布到我的数据库中时,我没有收到错误,但数据没有填充到表中。

你知道是什么原因引起的吗?以下是日志,如果有帮助的话。

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"IniAUnB4O51+1KrNy5Ip/nVPqmEZaXopoFozaBu98bkvg0MP5GxbEkzKKltY/QuVomxE2hnDT7cIloy99u0Nsw==", "contact_form"=>{"first_name"=>"Jack", "last_name"=>"Burum", "email"=>"", "address"=>"", "city"=>"", "state"=>"", "zip_code"=>"", "phone"=>""}, "commit"=>"Create Contact form"}
   (0.1ms)  begin transaction
  SQL (0.3ms)  INSERT INTO "contact_forms" ("created_at", "updated_at") VALUES (?, ?)  [["created_at", "2015-11-27 18:37:45.421056"], ["updated_at", "2015-11-27 18:37:45.421056"]]
   (7.3ms)  commit transaction
Redirected to http://localhost:3000/pages
Completed 302 Found in 11ms (ActiveRecord: 7.7ms)

2 个答案:

答案 0 :(得分:2)

当使用质量赋值创建记录时,如果控制器不允许使用参数,Rails将抛出错误。这是为了阻止人们将数据注入您不期望的数据库中。

想象一下,您有一个注册表单,并且您只想接受用户的姓名和电子邮件地址,还要考虑您的桌面上有一列名为is_admin的列。

通常,您的表单会从表单中提交params哈希中的:name:email,但想象一下攻击者构建自己的POST请求并插入{{1与其他数据一起。显然,您希望控制器忽略该部分请求!

所以,步骤强参数。启用此功能(默认情况下),您必须明确允许您愿意接受的params哈希的元素。在上面的例子中,你会使用这样的东西:

:is_admin => true

这将要求params.require(:user).permit(:name, :email) 中有:user元素,并允许params提供:user:name,但仅此而已。

然而,当您必须更改允许的参数时,在控制器中的许多地方使用它会很快变得烦人,因此通常将它放在私有方法中并从那里引用它:

:email

然后,您只需在控制器中的任何位置调用private def user_params params.require(:user).permit(:name, :email) end 方法即可使用它们!

因此,在你的情况下(正如你已经意识到的那样),你应该创建一个私有方法,它应该返回你愿意接受的允许的params,并在创建模型记录时使用该方法。

答案 1 :(得分:0)

所以我需要添加一个私人方法,我打电话给#para;联系params&#39;。在这种方法中,我允许访问表格中所需的数据。

当您希望create方法可以访问所有数据时,我仍然不清楚为什么需要允许数据属性。

现在有效。