0

これは私のフォームであり、正常に動作しますが、今は AJAX にしたいと考えています。

<%= form_tag variant_path(variant.id), :method => :put, :class => 'update_inv_form' do %>  
  <%= text_field_tag :inventory_quantity, variant.inventory_quantity %>
  <%= submit_tag 'Update'  %>
<% end %>

:remote => true 属性を追加すると、フォームは AJAX 経由で正常に送信されます (サーバーで発生していることがわかり、ページを更新すると変更が表示されます)。ページを更新せずにビューを適切に更新して変更を表示したい。これが私の更新アクションです: (ここでは ActiveRecord モデルを扱っていないことに注意してください。)

def update
  variant = ShopifyAPI::Variant.find(params[:id])
  variant.inventory_quantity = params[:inventory_quantity]
  variant.save
  redirect_to root_path
end

更新 これを理解するのに役立った回答に感謝しますが、解決策は彼が言ったとおりであることがわかりましたが、小さな問題に遭遇しました。更新したいビューがapp/views/home/index.html.erb あり、これを扱っていました: Variants#update. (バリアント コントローラ、更新アクション)

ビューと同じディレクトリに update.js.html を配置していましたがapp/views/home、サーバーが 500 エラーをスローしていました: テンプレートがありません。結局のところ、ディレクトリを作成し、app/views/variants/そこに update.js.html ファイルを配置する必要がありました。問題が解決しました。

4

1 に答える 1

5

JS形式に対応するには、アクションを変更する必要があります。

def update
  @variant = ShopifyAPI::Variant.find(params[:id])
  @variant.inventory_quantity = params[:inventory_quantity]
  @variant.save

  respond_to do |format|
    format.html { redirect_to root_path }
    format.js
  end
end

update.js.erb次に、ページを更新するJavaScriptを使用してファイルを作成できます。パーシャルがあるとしましょう。次の_variant.html.erbようにバリアントをdivに追加できます(jQueryを使用していると仮定します)。

$('.variant-list').append('<%= escape_javascript(render(:partial => "variant", :object => @variant)) %>');

アップデート

update.js.erb' file (Note: I have not tried this code). Let's say you have the following code in yourindex.html.erb`の使用例を次に示します。

<ul class="variants">
    <li id="101">Variant 1</li>
    <li id="102">Variant 2</li>
    <li id="103">Variant 3</li>
</ul>

あなたupdated.js.erbはこのように見えるかもしれません:

$('.variants #<%= @variant.id %>').text('<%= @variant.title %>');

これは、リストで更新したばかりのバリアントを見つけて、バリアントのタイトルを新しいものに変更することです。

于 2012-06-26T11:51:52.627 に答える