将field_with_error添加到动态命名的表单字段

时间:2016-01-15 10:08:54

标签: ruby-on-rails ruby-on-rails-4

我想在html上创建一个用于编辑项目模型的记录而不显示项目ID 的表单。
要识别项目记录,我使用 id_sub 列 ( id_sub 是10个字符的字符串。)

模型/ item.rb的

def item
  # ---------- columns ----------
  # id     : integer, primary key
  # id_sub : string
  # name   : string
end

因为我不想显示项目的ID ,所以我使用 id_sub 作为字段和参数。

这很好用 但是,如果出现错误,则不会将 field_with_error 添加到表单中。

这是因为Rails无法找到动态命名的字段,我认为 有没有办法让Rails找到动态命名的字段?
或者只是使用JavaScript吗?

控制器/ items_controller.rb

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

视图/项目/ edit_all.html.haml

= 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

任何帮助都将受到赞赏。 :)

2 个答案:

答案 0 :(得分:1)

使用表单构建器对象f。它将自动生成div class="field_with_error">tag个被调用(即f.text_fieldf.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) {