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

Posted

技术标签:

【中文标题】在 Rails 中通过 JS 设计注册#update【英文标题】:Devise Registration#update via JS in Rails 【发布时间】:2013-04-27 06:08:20 【问题描述】:

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

我想将表单远程提交到 registrations#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 响应而不是执行其默认重定向?

【问题讨论】:

也许这可以帮助natashatherobot.com/devise-rails-sign-in 【参考方案1】:

只需在 RegistrationsController 中添加一行,以便 Devise 知道同时响应 html 和 js。

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

阅读 respond_with 的真正帮助。几个不错的链接:

Rails API Responder

AsciiCast

【讨论】:

有趣的是,当#create 操作采用可悲的路径并将错误放在资源上时,此解决方案对我有效,在这种情况下,create.js.erb 会像您期望的那样被调用。这是表格中的remote: true。但在好的情况下,它会以 HTML 响应。我在 session#destroy 中看到了类似的问题,我必须重写一个私有的 Devise 方法 (respond_to_on_destroy) 才能让它响应 format.js。所以至少在某些情况下,Devise 已经将他们的响应代码推送到控制器方法中,如果不覆盖私有方法,您将无法获得它。【参考方案2】:

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

配置/初始化器/设计

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

config/routes.rb

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

controllers/users/registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController

  respond_to :html, :js

end

views/users/registrations/create.js.erb

alert('success');

views/users/registrations/new.js.erb

alert('invalid');

【讨论】:

http_authenticatable_on_xhr 应该设置为 false 以使其正常工作是一种误导。 @JPSilvashy 也许 Rails 或 Devise 在过去三年中发生了一些变化,并且不再需要 http_authenticatable_on_xhr,就像在回答时一样。我真的不再使用设计了...它是否仅与其他步骤一起工作,并且没有调整http_authenticatable_on_xhr?如果是这样,我将更新此答案(或随时提交您自己的答案)。

以上是关于在 Rails 中通过 JS 设计注册#update的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中通过 jQuery 调用 JSON 文件?

如何在rails中通过tcp发送值?

在 Rails 中通过 AJAX 加载更多用户电影

在 Rails 中通过 has_many 连接表

在 Rails 中通过其 belongs_to 关系查询记录

在 Rails 中通过 has_many 添加附加属性