这让我很生气。它之前有效,但我将属性更改为: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
答案 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)
在控制器中
表格
数据保存在数据库中
读取数据
希望有所帮助:)
答案 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>