在Rails中通过JS设计注册#update

时间:2013-05-02 22:23:12

标签: javascript ruby-on-rails ajax ruby-on-rails-3 devise

我正在尝试使用AJAX通过Devise更新用户模型,并让Devise使用正确的javascript文件进行响应。

我想将表单远程提交到注册#update操作,但这不适用于Devise的默认响应,它使用了RegistrationsController中的以下内容:

respond_with resource, :location => after_update_path_for(resource)

以上尝试重定向到默认路由,而不是呈现update.js.erb文件。我能够覆盖该操作,并使其与以下更改一起使用:

respond_to do |format|
    format.html
    format.js
 end

但是,这似乎非常暴力,因为我压倒整个行动。有没有一种简单的方法让Devise知道用javascript响应而不是做默认的重定向?

2 个答案:

答案 0 :(得分:12)

只需向RegistrationsController添加一行,以便Devise知道对html和js都做出响应。

class RegistrationsController < Devise::RegistrationsController
  respond_to :html, :js
end

了解respond_with如何真正起作用。几个良好的链接:

Rails API Responder

AsciiCast

答案 1 :(得分:2)

除了在表单中添加remote: true之外,我最近通过进行以下调整来解决这个问题:

<强>配置/初始化/色器件

# If http headers should be returned for AJAX requests. True by default.
config.http_authenticatable_on_xhr = false

<强>配置/ routes.rb中

devise_for :users, controllers: { registrations: 'users/registrations' }

<强>控制器/用户/ registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController

  respond_to :html, :js

end

<强>视图/用户/注册/ create.js.erb

alert('success');

<强>视图/用户/注册/ new.js.erb

alert('invalid');