How to submit an array field using a Rails form 提交包含数组字段的表单
下面仅仅显示部分重点代码
view: _form.html.slim
view: _form.html.slim
= form_for item=@topic do |f|
.mb-3
= f.label :name
= f.text_field :name, class: 'form-control'
.mb-3 id="tagArray"
= f.label :tags
button id="addTagBtn" Add
- if item.persisted?
- item.tags.each do |x|
= text_field_tag("topic[tags][]", x, { class: 'form-control'})
= text_field_tag("topic[tags][]", nil, { class: 'form-control', placeholder: 'new tag'})
这里可以加一段js代码,加个按钮,点击后生成一个空的 input 元素
可以在 application.js下面加上这么一段,也可以单独做个js文件,import到application.js里面
# document.addEventListener("turbolinks:load", function() {
# rails 7 使用hotwire后,需要监听的 turbo:load 事件了。
document.addEventListener("turbo:load", function() {
console.log("Turbo!")
document.querySelectorAll('#addTagBtn').forEach(function(addTagBtn) {
addTagBtn.addEventListener('click', function(event) {
var x = document.createElement("INPUT");
x.setAttribute("type", "text");
x.setAttribute("name", "topic[tags][]");
x.setAttribute("class", "form-control");
x.setAttribute("placeholder", "new tag");
document.getElementById('tagArray').appendChild(x)
})
})
end这里面的 tags 属于数组,不能使用 f.text_field 。
form_for item=@topic do |f|
end
这里的 f 表示 FormBuilder, f.text_field(...) 没法生成 name="topic[tags][]" 这种名字的input,所以需要使用text_field_tag来生成类似下面的html代码。
= text_field_tag("topic[tags][]", ‘en’, { class: 'form-control', placeholder: 'new tag'})
= text_field_tag("topic[tags][]", nil, { class: 'form-control', placeholder: 'new tag'}) ⇓
<input type="text" name="topic[tags][]" value="en" class="form-control"> <input type="text" name="topic[tags][]" class="form-control" placeholder="new tag">
The variable f yielded to the block is a FormBuilder object
form_for(record, options = {}, &block)
text_field(object_name, method, options = {}) f
controller里面的只需要设置好tags:[]即可:
private
def topic_params
params.require(:topic).permit(:name, tags:[]);
end
从turbolinks升级到hotwire和turbo 视频
从turbolinks升级到hotwire升级文字版
阅读量: 900
发布于:
修改于:
发布于:
修改于: