表单字段不出现在对象哈希中

时间:2013-08-03 16:46:16

标签: ruby-on-rails

我创建了一个Rails表单,用以下字段创建一个“事件”(嵌套在一个组资源中)。字段whenexactwhen(名字非常简单,我知道,我只是创建一个快速演示)是指日期和时间

<%= form_for [@group, @event], url: {action: "create"}, html: {class: "nifty_form"} do |f| %>
  <%= label_tag(:title, "Event Title") %>
  <%= f.text_field :title %>
  <%= label_tag(:description, "Event Description") %>
  <%= f.text_area :description, size: "60x12" %>
  <%= label_tag(:address, "Address") %>
  <%= f.text_field :address %>
  <%= label_tag(:when, "When") %>
  <%= text_field_tag(:when) %>
   <%= label_tag(:exactwhen, "exactwhen") %>
   <%= text_field_tag(:exactwhen) %>
  <%= f.submit "Create" %>
<% end %>

这些字段存在于数据库中的事件模型

 create_table "events", force: true do |t|
    t.string   "title"
    t.text     "description"
    t.string   "address"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "group_id"
    t.date     "when"
    t.time     "exactwhen"
  end

但是,当我提交表单时,您会注意到whenexactwhen未包含在事件哈希中

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"5kkL2a3yDHEINSqSg+1cXd708GtRPgymbKmASs+eih8=", "event"=>{"title"=>"First Wankers Meeting", "description"=>"get drunk", "address"=>"57 Robert Crescent"}, "when"=>"08/23/2013", "exactwhen"=>"12", "commit"=>"Create", "group_id"=>"38"}

并且whenexactwhen的数据未插入记录

 Group Load (0.6ms)  SELECT "groups".* FROM "groups" WHERE "groups"."id" = $1 LIMIT 1  [["id", "38"]]
   (0.2ms)  BEGIN
  SQL (2.0ms)  INSERT INTO "events" ("address", "created_at", "description", "group_id", "title", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["address", "57 Robert Crescent"], ["created_at", Sat, 03 Aug 2013 16:38:30 UTC +00:00], ["description", "get drunk"], ["group_id", 38], ["title", "First Wankers Meetup"], ["updated_at", Sat, 03 Aug 2013 16:38:30 UTC +00:00]]

我假设whenexactwhen的表单数据没有插入数据库,因为它们不在事件哈希中。如果是这样的话,你能解释一下原因,或解释我怎么能解决这个问题?

这是events_controller.rb

中的创建操作
 def create
      @group = Group.find(params[:group_id])
      @event = @group.events.build(event_params)
      if @event.save
      ....


    private
    def event_params

      params.require(:event).permit(:title, :description, :when, :exactwhen, :address)

    end

2 个答案:

答案 0 :(得分:0)

使用f.text_field代替text_field_tag,就像使用前几个表单字段一样

答案 1 :(得分:0)

您正在使用form_for。将所有字段(和标签)更改为普通字段,而不是标记字段。因此,将text_field_tag更改为text_field。

如果你这样做,一切都应该有效。然后所有属性都应该在正确的params散列中。

有关详细信息,请查看rails api docs中的form_for。