Rails Param赢了。应该是字符串数组时为NULL

时间:2018-02-02 03:49:31

标签: ruby-on-rails

这让我很生气。它之前有效,但我将属性更改为:service,因为最初我不小心使用了错误的字段......

我有发票

  create_table "invoices", force: :cascade do |t|
    t.integer  "reference_number"
    t.datetime "date"
    t.boolean  "paid"
    t.string   "payment_method"
    t.string   "service"
    t.decimal  "total"
    t.text     "special_instructions"
    t.integer  "contractor_id"
    t.integer  "customer_id"
    t.datetime "created_at",           null: false
    t.datetime "updated_at",           null: false
    t.index ["contractor_id"], name: "index_invoices_on_contractor_id"
    t.index ["customer_id"], name: "index_invoices_on_customer_id"
  end

我想将一串字符串保存到服务列。我已经在我的控制器中正确地允许了我的参数,但是当我保存发票时,我不断获得NULL服务...(其他任何字段都保存正确,如果我将其更改为text_field而是复选框,它保存。让我相信我的观点是问题?)它现在设置的方式有多个复选框可供选择,应该像这样保存,例如:["item1", "item2"]但它不起作用。

在我的form_for(invoice) do |f|

<form>
  <div class="form-row">
    <div class="items">
      <% items = ['item1', 'item2', 'item3', 'item4', 'item5'] %>
      <%= f.label :service, "Service Provided" %>
      <div class="form-inline form-check-inline">
        <% items.each do |item| %>
          <div class="item-options">
             <%= f.check_box :service, { class: 'form-check-input', multiple: true}, item, nil %>
             <%= f.label item, class: "form-check-label" %>
          </div>
        <% end %>
      </div>
    </div>
  </div>
</form>

我的invoices_controller.rb

中的参数
def invoice_params
  params.require(:invoice).permit(:customer_id, :contractor_id, [...], service: [])
end

但它不会保存。我必须做一些非常愚蠢的事情,这使得这不起作用。我之前有过工作,但现在我花了太多时间试图搞清楚。感谢。

编辑:如果我这样做,它的工作方式......但我只想要一些dang复选框。

<div class="form-group">
    <%= f.label :service %>
    <%= f.text_field :service %>
</div>

def invoice_params
  params.require(:invoice).permit(:customer_id, :contractor_id, [...], :service)
end

2 个答案:

答案 0 :(得分:0)

我认为这里的问题是service的数据类型是字符串,但是您希望保存Array数据。如果您的数据库不支持Array数据类型,Rails可以帮助您在保存数据时自动将数据转换为String,并在读取数据时将String转换为Array。< / p>

# In your model
class Invoice < ApplicationRecord
    serialize :service
    ...
end

我添加了一些关于示例的图像(Rails 5.1.4,Database:Mysql)

在控制器中

In controller

表格

html

Form

数据保存在数据库中

Data is saved in database

读取数据

Read data

希望有所帮助:)

答案 1 :(得分:0)

所以我想我的观点中肯定存在一些奇怪的问题。我回滚到之前的提交并采用我的旧视图代码(没有任何引导程序和粗略的形状格式)并且它工作...所以我猜测多个<form>标签的嵌套和形式 - 团体是罪魁祸首?我真的没有任何其他解释。

尽管如此,我最终还是使用了不同的代码来处理我的多个复选框。它工作得很好并且这样做我能够看到我在编辑发票时选择的项目,因为旧代码没有选择框。

<% services = ['item1', 'item2', 'item3', 'item4'] %>
<h4>Service Provided</h4>
<div class="form-inline form-check-inline">
  <% for service in services %>
    <%= check_box_tag "invoice[service][]", service, invoice.service.to_s.include?(service), :multiple => true, :include_blank => TRUE %>
    <%= f.label service, class: "form-check-label" %>
    <% end %>
</div>