2009-02-25 109 views
12

選擇下拉框選項時,自動提交AJAX表單的最簡單和最優雅的方式是什麼?我正在創建一個管理頁面,管理員可以在其中修改用戶權限(其中「權限」以整數形式存儲),並且我希望「權限」字段是一個下拉框,在管理員自動提交和更新時點擊他希望用戶擁有的選項。Rails:當點擊下拉選項時提交(通過AJAX)

這是我目前正在查看的精簡版本。我需要知道將其轉換爲遠程表單的最佳方式,當單擊選項時會自動提交。

隨意指出任何切向建議或其他任何東西......我對Rails比較陌生,只是到了可以編寫代碼而無需不斷引用其他人的工作的地步。

<!-- This is the "index" view, by the way. --> 
<% for membership in @story.memberships %> 
    <% form_for membership do |f| %> 
    <%= f.select :permissions, [['none', 0], ['admin', 9]] %> 
    <% end %> 
<% end %> 

回答

15

有一對夫婦的方式來處理這個問題。當然,觀察現場的做法是一個,但你也可以使用一個簡單的JavaScript或remote_function做到這一點:

下面是一個簡單的JS方法:

<% remote_form_for membership do |f| %> 
    <%= f.select :permissions, [['none', 0], ['admin', 9]], {}, :onchange => 'this.form.submit()' %> 
<% end %> 

另一種方法是這樣的,並且會避開表單構建器(並且這可能具有幾個語法錯誤):

<%= select_tag(:permissions, [['none', 0], ['admin', 9]], {:onchange => "#{remote_function(:url => permissions_path(:story_id => story, 
      :with => "'permission='+value")}"}) 

我個人更喜歡前者。

+0

嘗試這兩種解決方案之後,這個結束了工作更好,更好看。謝謝! – 2009-03-02 18:13:41

+4

哪一個是第一個還是第二個? – Angela 2010-05-27 23:01:00

4

三步!

  1. 讓你的form_for a remote_form_for;添加一個ID!
  2. 添加observe_fieldselect
  3. 配置後您的observe_field提交表單

最後一位看起來像:

<%= observe_field "id_of_select", :function => "$('form_id').submit();" %> 
3

瞭解如何使用您選擇的框架在沒有Rails的情況下執行此操作。使用Rails標籤執行AJAX可以快速完成任務,但是當您需要更改關於標籤如何執行的特定事項時,這可能會非常有限。

閱讀關於Web標準,以及如何編寫不顯眼的這些網站的JavaScript: http://ajaxian.com/ http://www.alistapart.com/

您可以通過學習如何在不進行Rails的AJAX創造更靈活,用戶界面令人驚歎。

4

在Rails 3:

<%= form_for(membership, :remote => true) do |f| %>` 
    <%= f.select :permissions, [['none', 0], ['admin', 9]], {}, :onchange => 'this.form.submit();' %> 
<% end %> 

注意,這不是this.form.submit();的onsubmit。別忘了Javascript分號。

1

我使用Rails 5 &我也面臨着類似的情況,但在我的情況下,由@scott給出的答案是不使用提交作爲AJAX預期,雖然我加入了remote: true選項form表單(我不在表格中有submit按鈕)。

如果有人也面臨着類似的問題,試圖改變這 - 像

<% form_for membership remote: true, id: '#member_form' do |f| %> 
    <%= f.select :permissions, [['none', 0], ['admin', 9]], onchange: '$("#member_form").trigger("submit");' %> 
<% end %> 

希望這有助於JS代碼..

相關問題