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