json - 如何为 Rails 3 中的自定义 Devise Controller 设置默认格式(如 JSON)?

标签 json ruby-on-rails-3 devise

我的 Rails 3 应用程序具有三个自定义 Controller ,用于我的 Devise + OmniAuth 集成。我需要为用户注册和 session 重写标准方法,例如"new"。我特别需要 Controller 方法来处理与 JSON 格式兼容的重定向和响应。

在我的 routes.rb 文件中,我有以下内容:

devise_for :users, :controllers => { 
      :omniauth_callbacks => "users/omniauth_callbacks", 
      :registrations      => "users/registrations", 
      :sessions           => "users/sessions"
}

这按预期工作。我的路线现在显示自定义 Controller 路线,如:

new_user_session GET  /users/sign_in(.:format) {
      :action      =>"new", 
      :controller  =>"users/sessions"
}

new_user_registration GET /users/sign_up(.:format) {
      :action=>"new", 
      :controller=>"users/registrations"
}

要设置资源的默认格式,我会这样做:

resources :users, :defaults => { 
      :format => 'json' 
}

所以,我尝试了这个:

namespace "users" do
  resources :registrations, :defaults => { 
      :format => 'json' }
  resources :sessions, :defaults => { 
      :format => 'json' }
end

没有按预期工作。我最终选择了这些路线:

new_users_registration GET /users/registrations/new(.:format) {
      :format=>"json", 
      :action=>"new", 
      :controller=>"users/registrations"
}

new_users_session GET /users/sessions/new(.:format) {
      :format=>"json", 
      :action=>"new", 
      :controller=>"users/sessions"
}

为了让它与我在 Devise 中的自定义覆盖一起使用,我需要格式化“new_user_registration”而不是“new_users_registration”。

我检查了“devise_for”方法,它没有 :defaults 选项。我可以使用 'devise_scope' 方法来设置各个路由,但这似乎远不如 :defaults 习惯用法简洁。

有谁知道我可以使用任何路由魔术来实现这一目标吗?

最佳答案

我找到了一个不一定令人满意但有效的答案。我在 routes.rb 中试过这个:

devise_scope :user do
 get "sign_up", :to => "users/registrations#new", 
                :defaults => { :format => 'json' }
end

我在我的自定义 Controller 中试过这个:

redirect_to new_user_registration_url, :format => 'json'

都没用。我猜这两个在实现中都是不正确的。我终于在我的自定义 Controller 中使用了它:

redirect_to :controller => 'users/registrations', 
            :action => 'new', 
            :format => 'json'

它取代了我原来拥有的所有地方:

redirect_to new_user_registration_url

它比我喜欢的更冗长,也不是很干,但它确实有效。

关于json - 如何为 Rails 3 中的自定义 Devise Controller 设置默认格式(如 JSON)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753862/

相关文章:

ruby-on-rails - 更新到 Rails 3.2.2 : How to properly move my plugin from the '/vendor' to '/lib' directory?

devise - Devise::Mailer的设置-散居者smtp_envelope_from和smtp_envelope_to sendmail

javascript - c3.js一致的配色方案

ios - iOS 中的 JSON 错误 : Invalid top-level type in JSON write

json - 获取 Steam 元素价格

ruby-on-rails-3 - PG::Error: ERROR: 将记录插入关联模型时,列 "created_at"中的空值

javascript - 从 GET 响应/JSON 对象中提取数据

ruby-on-rails - Rails 3.2 流媒体

ruby-on-rails - 设计 - 快速通知

postgresql - Rails 5 - PG::UndefinedTable: 错误:关系 "application_records"不存在