2017-07-06 23 views
1

我使用devise_token_auth和一切正常,直到我加入API約束路由:constraints: ApiConstraint.new(version: 4, default: true)如何調解使用ApiConstraints設計重置密碼路由?

Rails.application.routes.draw do 
    namespace :api do 
    scope module: :v4, constraints: ApiConstraint.new(version: 4, default: true) do 
     # Token auth routes available at /api/auth 
     mount_devise_token_auth_for "User", at: "auth" 
    end 
    end 
end 

添加這些約束限制訪問路線,除非請求中包含正確的頭:

class ApiConstraint 
    attr_reader :version 

    VENDOR_MIME = "application/vnd.myproject-v%d" 

    def initialize(version: "4", default: false) 
    @version, @default = version, default 
    end 

    def matches?(request) 
    byebug # <-- I wish there was something like request.current_path available 
    return @default unless request.headers.key?("accept") 
    request 
     .headers 
     .fetch("accept") 
     .include?(VENDOR_MIME % version) 
    end 
end 

我意識到這是有問題的重置密碼鏈接,我們通過電子郵件獲得:

https://myproject.herokuapp.com/api/auth/password/edit?reset_password_token=... 

...因爲它不能攜帶任何標題!

我可以將用戶重定向到一個網頁,然後就一個AJAX調用與適當的標題,但我不知道是否有辦法來提高我的routes.rbApiConstraint類,使/auth/password/edit路線上的異常?

+1

是'request.url'或'request.fullpath'你在找什麼? – Shiyason

+0

@Shyyason是!隨意做出答案 –

回答

1

您可以使用request.url,request.fullpath,request.params來訪問您需要的數據。

更重要的是,爲了弄清楚在運行時可以使用哪些方法,一旦REPL在你放置byebug調試器條目的行上打開,你可以使用以下方法(假設你使用的是pry):

ls # display everything in the current scope 
cd request # or any other variable or instance variable. 
cd .. # you can navigate your code as if it was a filesystem 

request.methods.grep /path/ 
request.methods.grep /url/ 
request.methods.grep /param/ 

# or 

cd request 
methods.grep /query/ 

OP更新

# api_constraint.rb 
def initialize(version: "4", default: false, exceptions: []) 
    @version, @default, @exceptions = version, default, exceptions 
end 

def matches?(request) 
    return true if @exceptions.include? request.path 
    ... 
end 
#routes.rb 
scope module: :v4, constraints: ApiConstraint.new(version: 4, default: true, exceptions: [ 
    "/api/auth/password/edit" 
]) do 
    ... 
end