我想在html上创建一个用于编辑项目模型的记录而不显示项目ID 的表单。
要识别项目记录,我使用 id_sub 列
( id_sub 是10个字符的字符串。)
def item
# ---------- columns ----------
# id : integer, primary key
# id_sub : string
# name : string
end
因为我不想显示项目的ID ,所以我使用 id_sub 作为字段和参数。
这很好用 但是,如果出现错误,则不会将 field_with_error 添加到表单中。
这是因为Rails无法找到动态命名的字段,我认为
有没有办法让Rails找到动态命名的字段?
或者只是使用JavaScript吗?
def update_all
@errors = []
@items = params[:item].map do |id_sub, item_params|
item = Item.find_by(id_sub: id_sub)
if item && !item.update(name: item_params[:name])
@errors << item.errors
end
item
end
if @errors.blank?
redirect_to :edit_all_items
else
render :edit_all
end
end
= form_tag update_all_items_path, method: :patch do
- @items.each do |item|
= fields_for 'items[]', item do |f|
-# --- Dynamically named field below. ---
= text_field_tag "items[#{item.id_sub}][name]"
= submit_tag
任何帮助都将受到赞赏。 :)
答案 0 :(得分:1)
使用表单构建器对象f
。它将自动生成div class="field_with_error">
每tag
个被调用(即f.text_field
,f.number_field
)。
对于您的自定义ID,您需要在include_id: false
中传递fields_for
,然后添加自己的hidden_field
id_sub
。
- @items.each do |item|
= fields_for 'items[]', item, include_id: false do |f|
-# --- Dynamically named field below. ---
= f.hidden_field :id_sub, value: f.object.id_sub
= f.text_field name.to_sym
= f.submit
您还需要更新控制器,因为您不应将items[]
的索引关联为Item模型的主键。
def update_all
@items = params[:item].map do |index, item_params|
Item.find_by(id_sub: item_params[:id_sub]).update(item_params)
end
# @items will already contain the error messages at this point should there be errors,
# Errors will then be shown in the view accordingly
end
答案 1 :(得分:1)
解决。
此选项是必需的。
index:item.id_sub
request({url: url, forever: true}, function (error, response, body) {