如何使用不同的mime类型/内容类型使Devise工作?

时间:2011-10-28 13:43:30

标签: ruby-on-rails-3 devise mime-types

我在Ruby on Rails上使用Devise。我有几个页面,我使用不同的mime类型 - 说/myapp/products.test ...所以我已经注册了一个名为'test'的mime类型,它类似于text / html ...而且我有内容协商以显示html.erb模板或test.erb模板......

现在 - 当我有authenticate_user时!在我的控制器中的方法 - 我正在使用'test'mime-type - 我没有正确地重定向 - 我根本没有被重定向 - 我只是得到一个“你需要登录或注册才能继续。 “消息。

在Devise中需要覆盖什么,以便在我使用除html之外的mime类型时重定向?

1 个答案:

答案 0 :(得分:1)

我在以下维基页面上找到了部分答案:https://github.com/plataformatec/devise/wiki/How-To:-Make-Devise-work-with-other-formats-like-mobile,-iphone-and-ipad-(Rails-specific

所以 - 总结(除了注册问题中解释的mime类型等):

在config / initializers / devise.rb文件中,取消注释 config.navigational_formats 行并替换为:

config.navigational_formats = [:"*/*", "*/*", :html, :test]

将文件添加到初始值设定项,并将以下内容添加到其中:

ActionController::Responder.class_eval do
  alias :to_test :to_html
end

我还需要覆盖一个设计方法,因为我的mime类型实际上也响应了html - 但我确实想知道它是否也响应:test。因此,再次在initializers文件夹中,添加包含以下内容的文件:

module Devise
  module Controllers
    # Helpers used in both FailureApp and Devise controllers.
    module SharedHelpers

      protected

      # Helper used by FailureApp and Devise controllers to retrieve proper formats.
      def request_format
        @request_format ||= if request.format.test?
          :test
        elsif request.format.respond_to?(:ref)
          request.format.ref
        elsif MIME_REFERENCES
          request.format
        elsif request.format # Rails < 3.0.4
          request.format.to_sym
        end
      end

    end
  end
end

它可能会更干净 - 而不是覆盖上述方法 - 覆盖 Warden 中的方法,该方法会重定向到未经授权的网址 - 但我无法理解它out,也不确定设计(上游)是否不是覆盖方法的更好地方。