2016-01-13 42 views
2

我有我的API v1和v2指向相同的设计模式与下面的路线两个Route:问题与设计RESOURCE_NAME当两个路径指向同一个模型

scope :api do 
    namespace :v1 do 
    devise_for :users, :controllers => {:registrations => "devise/v1/users_registrations", 
             :sessions => "devise/v1/users_sessions", 
             :passwords => "devise/v1/users_passwords"} 
    end 
end 

scope :api do 
    namespace :v2 do 
    devise_for :users, :controllers => {:registrations => "devise/v2/users_registrations", 
             :sessions => "devise/v2/users_sessions", 
             :passwords => "devise/v2/users_passwords"} 
    end 
end 

我的问题,当一个请求被发送到这些API中的任何一个Devise resource_name是'v1_user'或'v2_user',但发送的参数具有params ['user']所需的值。

我从Devise helpers.rb devise_parameter_sanitizer方法中获取此信息。当设计:: ParameterSanitizer.new(resource_class的,RESOURCE_NAME,则params)PARAMS看起来象下面这样:

result = {ActionController::Parameters} ActionController::Parameters (4 elements) 
'user' = {ActionController::Parameters} ActionController::Parameters (16 elements) 
'email' = "[email protected]" 
'password' = "qwertyuiop" 
'first_name' = "test" 
'last_name' = "testtest" 
'ship_street_address' = "1 main st" 
'ship_city' = "rome" 
'ship_state' = "TX" 
'ship_zip_code' = "12345" 
'dealer_number' = "1234567890" 
'business_name' = "ABC Pumps" 
'bus_street_address' = "121 West Ave" 
'bus_city' = "San Antonio" 
'bus_state' = "NY" 
'bus_zip_code' = "73412" 
'distributor_id' = "1" 
'additional_distributor_id' = "1" 
'controller' = "devise/v1/users_registrations" 
'action' = "create" 
'format' = "json" 

不知道这将是有用的信息,但这里是devise_mapper:

result = {Devise::Mapping} #<Devise::Mapping:0x007fc7a2c8d950> 
@class_name = "User" 
@controllers = Hash (3 elements) 
@failure_app = {Class} Devise::FailureApp 
@format = nil 
@klass = {Devise::Getter} #<Devise::Getter:0x007fc7a2c8d338> 
@modules = Array (7 elements) 
@path = "users" 
@path_names = Hash (8 elements) 
    registration => 
    new => new 
    edit => edit 
    sign_in => sign_in 
    sign_out => sign_out 
    password => password 
    sign_up => sign_up 
    cancel => cancel 
@path_prefix = "/api/v1" 
@router_name = nil 
@routes = Array (3 elements) 
    [0] = {Symbol} session 
    [1] = {Symbol} password 
    [2] = {Symbol} registration 
@scoped_path = "v1/users" 
@sign_out_via = {Symbol} delete 
@singular = {Symbol} v1_user 
@strategies = Array (2 elements) 
    [0] = {Symbol} rememberable 
    [1] = {Symbol} database_authenticatable 
@used_helpers = Array (3 elements) 
    [0] = {Symbol} session 
    [1] = {Symbol} password 
    [2] = {Symbol} registration 
@used_routes = Array (3 elements) 
    [0] = {Symbol} session 
    [1] = {Symbol} password 
    [2] = {Symbol} registration 
+0

想知道downvote的原因。也许我可以更好地问这个问题? – KevinM

回答

1

我做最终想出一个解决方案,但它不是我喜欢的那么多。我仍然愿意接受其他建议,所以我不打算将此标记为已接受的答案,但至少已完成工作。

基本上在我的设计控制器中,我添加了一个before_filter,它将期望的参数添加到request.parameters和local params。这很简单,但感觉真的很黑。当然,我已经通过单元测试了它在未来的变化。

before_filter :sanitize_params 

def sanitize_params 
    request.parameters[:v2_user] = params[:user] unless params[:user].nil? 
    params[:v2_user] = params[:user] unless params[:user].nil? 
end