12

选择下拉框的选项时,自动提交 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 %>
4

5 回答 5

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")}"})

我个人更喜欢前者。

于 2009-02-26T04:18:10.887 回答
4

三步!

  1. 做你form_forremote_form_for;加个身份证!
  2. observe_field在你之后添加一个select
  3. 配置您observe_field提交表单

最后一点看起来像:

<%= observe_field "id_of_select", :function => "$('form_id').submit();" %>
于 2009-02-25T19:52:00.400 回答
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 分号。

于 2011-06-03T19:13:09.587 回答
3

了解如何在没有 Rails 的情况下使用您选择的框架来完成它。使用 Rails 标记执行 AJAX 可以快速完成任务,但是当您需要更改有关标记执行方式的特定内容时可能会受到很大限制。

阅读有关 web 标准以及如何在这些网站上编写不显眼的 javascript:http: //ajaxian.com/ http://www.alistapart.com/

通过学习如何在没有 Rails 的情况下执行 AJAX,您将能够创建更灵活、更令人惊叹的 UI。

于 2009-02-28T00:41:36.787 回答
1

我正在使用 Rails 5,我也面临类似的情况,但在我的情况下,@scott 给出的答案没有AJAX按预期提交表单,尽管我remote: true在表单中添加了选项(表单中没有submit按钮) .

如果有人也面临类似的问题,请尝试像这样更改 JS 代码-

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

希望这可以帮助..

于 2017-01-24T05:13:49.000 回答