gema ruby-on-rails api devise routes

ruby-on-rails - gema - devise gem



Emita con Devise resource_name cuando dos rutas apuntan al mismo modelo (1)

Tengo dos rutas para mi api v1 y v2 que apuntan al mismo modelo de Devise con las siguientes rutas:

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

Mi problema es que cuando se envía una solicitud a cualquiera de estas API, el Devise resource_name es ''v1_user'' o ''v2_user'', pero los parámetros enviados tienen los valores necesarios en params [''user''].

Obtengo esta información del método Devise helpers.rb devise_parameter_sanitizer. Cuando Devise :: ParameterSanitizer.new (resource_class, resource_name, params) params se ve a continuación:

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"

No estoy seguro si esta será información útil, pero aquí está el 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


Terminé encontrando una solución, pero no es una que me guste demasiado. Todavía estoy abierto a otras sugerencias, así que no voy a marcar esto como la respuesta aceptada, pero al menos hizo el trabajo.

Básicamente en mis controladores de diseño agregué un before_filter que agregaba el parámetro esperado a la solicitud. Parámetros y parámetros locales. Es bastante simple, pero se siente realmente hacky. Por supuesto que he probado la unidad al máximo en caso de que los cambios la rompan en el futuro.

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