0

これがどのように行われるか知りたいです。単純なProductモデルがあり、あるページでリンクをクリックして、AJAX によって製品フォームを追加したいとしましょう。次に、他の製品フォームをポップアップし、最初のフォームを完成させて送信し、他のフォームにも同じことを行います。

これが私が使用するコードです。


インデックスページでは、リンクから商品フォームを追加、作成、一覧で見ることができます。

製品/index.html.erb

<h1>Products</h1>

<%= link_to "Product", new_product_path, :remote => true %>

<div id="product_form">
  <%= render 'form' %>
</div>

<ul id="products">
  <%= render :partial => @products.reverse %>
</ul>

製品/_form.html.erb

<%= form_for(@product, :remote => true) do |f| %>
    <%= f.text_field :name %>
    <%= f.text_field :price %>
  <%= f.submit %>
<% end %>

製品/_product.html.erb

<%= content_tag_for(:li, product) do %>
  <p><%= product.name</p>
  <p><%= product.price %></p>
<% end %>

製品コントローラー

def index
  @products = Product.all
  @product = Product.new
end

def create
  @product = Product.new(params[:product])

  respond_to do |format|
    if @product.save
      format.html { redirect_to products_url }
      format.js
    else
      format.html { render action: "index" }
      format.js
    end
  end
end

作成されると、製品が_product部分的に表示されます。

製品/create.js.erb

$('#products').prepend('<%= escape_javascript(render(@product)) %>');

リンクをクリックすると、製品フォームが<div id="product_form">

製品/new.js.erb

$("#product-form").html("<%= escape_javascript(render(:partial => 'products/form', locals: { product: @product })) %>");

これで 1 つの製品フォームが生成されますが、同じページに他の製品フォームをレンダリングする背後にあるコード ロジックを知りたいです。これはどのように行われますか?

4

1 に答える 1

0

通常、製品のコレクションを表す 2 番目のオブジェクトを使用してこれを行います。これは、ビジネス ロジック (ProductCategory や ShoppingCart など) に適合する場合はアクティブ レコードにするか、関連する各製品を保存する保存メソッドを持つ単純な ActiveModel "Products" にすることができます。

Active Presenterでこのメカニズムの詳細を確認できますが、アクティビティが非常に少ないため、この gem は使用しません。

于 2012-06-30T19:07:37.437 に答える