1

我有用户类(使用设计),我的用户类有电子邮件订阅

class User < ActiveRecord::Base
  ...
  has_one :email_sub, :class_name => "Subscriptions::EmailSub", :dependent => :destroy

end

我有路线

match 'profile', :controller => 'users', :action => 'view_profile'

以及调用特定文件的相关控制器

class UsersController < ApplicationController

  def profile
    @subscriptions_email_sub = current_user.email_sub
  end

end

并且在 profile.html.erb 文件中有一个表单(技术上包含在模板中的一部分,但我认为这不会产生影响),用户可以使用单选按钮设置订阅选项(订阅或取消订阅)。表单的按钮部分如下:

  <%= form_for(@subscriptions_email_sub) do |f| %>
    ...
    <tr>
      <td>Announcements</td>
      <td><%= f.radio_button :announcements, 'announcements', :checked => @subscriptions_email_sub.announcements %></td>
      <td><%= f.radio_button :announcements, 'announcements', :checked => !@subscriptions_email_sub.announcements %></td>
      <td></td>
      <td>Updates about the website and service</td>
    </tr>
    <%= f.submit "Update Subscriptions", :id => 'update_subs' %>
  <% end %>

我正在尝试添加咖啡脚本,因此当用户单击按钮时,它会保存模型并通知用户设置已更新(如果出现错误,则会发出警报)。

(或者,我可以保存模型并重新加载整个页面。)

到目前为止,我在 users.js.coffee

$ ->
  $('#update_subs').click ->
    $('form').submit();

我不知道如何让页面重新加载。我认为表单提交会导致它使用 Subscriptions::EmailSub 的控制器,然后它会尝试加载 app/views/subscriptions/email_subs/show.html.erb 我怀疑我可能必须使用 javascript 来保存类和重新加载页面。

谢谢你的帮助。

4

1 回答 1

0

您不需要该代码users.js.coffee,您可以将表单设为远程:

<%= form_for(@subscriptions_email_sub), :remote => true do |f| %>

这将异步提交表单,期待 JS 响应(除非您指定另一种内容类型,例如 JSON)。

您需要有一个控制器操作来处理此更新,大概是您的SubscriptionsController.

它应该响应 javascript 请求:

class SubscriptionsController < ApplicationController
  respond_to :js
  ...

  def update
    @subscription = Subscription.find(params[:id])
    ...

    respond_with(@subscription)
  end
end

然后你可以简单地添加一个update.js.coffee文件到你的views/subscriptions 文件夹中,并在其中添加你想要对DOM 进行的任何更改,就像你对常规javascript 所做的那样。

# update.js.coffee
alert "Email subscription updated!"
$('form').ignite_fireworks()
于 2012-12-05T02:32:25.747 回答