在 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 文件?