在每个循环中渲染 simple_form,rails 6

Rendering a simple_form inside an each loop, rails 6

我正在创建一个购物清单应用程序,每个用户都有一个清单,每个清单都有很多项目。

在显示页面上,我遍历用户列表并显示列表中的每个项目并打印出项目名称、描述和 link 以更新项目。

问题是,更新表单总是使用每次迭代中的第一项而不是分配给它的项。

我可以有一个包含 5 行项目的列表,每个项目的更新 link 将始终填充行中的第一个项目。

我是 rails 的新手,如有任何帮助,我们将不胜感激!

路线

  Rails.application.routes.draw do
  patch 'items/pick/:id', to: "items#pick", as: :pick

  devise_for :users
  root to: 'lists#index'
  resources :lists do
    resources :items
  end
end

列出控制器

class ListsController < ApplicationController
  def index
    @lists = List.all
  end

  def show
    @list = List.find(params[:id])
  end

  def new
    @list = List.new
  end
end

物品控制器

class ItemsController < ApplicationController
  def new
  end

  def create
    @list = List.find(params[:list])
    @item = Item.new(item_params)
    @item.list_id = @list.id
    @item.user_id = current_user.id
    if @item.save!
      redirect_to list_path(@list), notice: "Item added to list."
    else
      render :new, notice: "Something went wrong..."
    end
  end

  def edit
  end

  def update
    @item = Item.find(params[:id])
    if @item.update(venue_params)
      redirect_to venue_path(@venue)
    else
      render :edit
    end
  end

  def destroy
    @item = Item.find(params[:id])
    @item.destroy
    redirect_to list_path(params[:list_id])
  end

  def pick
    item = Item.find(params[:id])
    if item.buyer.nil?
      item.buyer = current_user.id
    else
      item.buyer = nil
    end
    item.save!
    redirect_to lists_path
  end

  def item_params
    params.require(:item).permit(:item_name, :description, :link, :price)
  end
end

显示页面 - 更新表单呈现为每个循环中的最后一项

<div class="container">
  <div class="row">
    <div class="col-md-12 mt-5">
      <h2>Hello <%= current_user.first_name %> </h2>
      <p>Welcome to Listy, the new home of your gift lists</p>
      <h4 class="mb-3">Manage: <%= link_to "Family lists", lists_path %></h4>


        <div class="card p-3 mb-3">
            <p><%= @list.title %> ID: <%= @list.id  %> </p>
            <% @list.items.sort.each do |item| %>
              <div class="list-flex">
                <div class="item_name"><%= item.item_name %></div>
                <div class="description-show-page"><%= item.description %></div>
                <div class="link"><%= render "lists/partial/update_item", list: @list, item: item %></div>
              </div>
            <% end %>
        </div>

      <%= render "lists/partial/add_item" %>

    </div>
  </div>
</div>

更新部分

<a type="" class="gray" data-toggle="modal" data-target="#updateModal">
  <i class="far fa-edit"></i>
</a>
<!-- Modal -->
<div class="modal fade" id="updateModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">Update item</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">

        <%= simple_form_for [@list, item] do |f| %>
          <h2> <%= item.id %></h2>
          <%= hidden_field_tag 'list', @list.id %>
          <%= f.input :item_name %>
          <%= f.input :description %>
          <%= f.input :link %>
          <%= f.input :price %>
          <%= f.submit "Add Item", class: "btn btn-outline-primary" %>
        <% end %>

      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-outline-warning" data-dismiss="modal">Close</button>
      </div>
    </div>
  </div>
</div>

显示页面上的列表图片,注意更新 links

每次更新link 使用列表中的第一项呈现表单,90 是列表 ID

接缝一个经典的编辑模式场景

当您加载页面时,您只呈现一个模式。

您有 3 条记录,这意味着您需要 3 个模态

OR 你可以动态创建一个新的模式,比如 Rails: Edit record in Bootstrap modal