我有一个看起来像这样的表格
<%= 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)
答案 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方法可以访问所有数据时,我仍然不清楚为什么需要允许数据属性。
现在有效。