【问题标题】:How do I set the default format, like JSON, for a customized Devise controller in Rails 3?如何在 Rails 3 中为自定义的 Devise 控制器设置默认格式,如 JSON?
【发布时间】:2011-01-21 12:50:38
【问题描述】:

我的 Rails 3 应用程序具有三个自定义控制器,用于我的 Devise + OmniAuth 集成。我需要覆盖用户注册和会话的标准方法,如“新”。我特别需要控制器方法来处理与 JSON 格式兼容的重定向和响应。

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

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

按预期工作。我的路由现在显示自定义控制器路由,例如:

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 成语简洁。

有谁知道我可以使用什么路由魔法来实现这一点?

【问题讨论】:

    标签: json ruby-on-rails-3 devise


    【解决方案1】:

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

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

    我在我的自定义控制器中尝试了这个:

    redirect_to new_user_registration_url, :format => 'json'
    

    都没有用。我猜这两个在实施中都不正确。我终于在我的自定义控制器中使用了它:

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

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

    redirect_to new_user_registration_url
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2012-06-20
      相关资源
      最近更新 更多