2012-06-26 163 views
0

這是我的表單,它工作正常,但現在我想要AJAX它。AJAX Rails 3.2表單提交

<%= 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 %> 

當我添加了:遙控=> true屬性的形式通過AJAX成功提交(我可以看到它發生在服務器上,我可以看到的變化,當我刷新頁面)。我想正確更新視圖以顯示更改而不刷新頁面。這是我的更新操作:(注意,我不與ActiveRecord的模式在這裏工作)

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

UPDATE 謝謝你幫助我弄清楚了這一點原來的解決方案是完全一樣的,他說的答案,但是我遇到了一個小問題。我想更新的視圖生活在app/views/home/index.html.erb,我正在處理這個問題:Variants#update。 (變體控制器,更新動作)

我把我的update.js.html放在與我的視圖相同的目錄中:app/views/home和我的服務器拋出500錯誤:Missing Template。事實證明,我不得不創建一個app/views/variants/目錄,並將update.js.html文件放在那裏。問題解決了。

回答

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 your爲例index.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 %>'); 

這樣做是找到剛在列表中更新的變體,並將變體標題更改爲新變體。

+0

謝謝,我稍後再嘗試併發布更新。我沒有使用任何部分,這種形式住在我的index.html.erb頁面上。我應該在更新操作中使用實例變量@variant而不是本地變量,就像你在這裏一樣? – dylanjha

+0

是的,因爲您需要訪問update.js.erb文件中的變量。我已經添加到我的答案中,讓您更好地瞭解如何更新更新頁面。 –

+0

謝謝!我陷入了讓js模板執行但最終弄清楚的一點點。我發佈了一個更新。再次感謝。 – dylanjha