2015-04-23 1 views
2

Итак, я наблюдал какое-то странное поведение при реализации конечной точки для RESTful API, который я создаю для мобильного клиента. Я использую метод PUT для обновления атрибута на модели User. Я отправляю идентификатор пользователя в качестве параметра URL и значение для обновления внутри объекта JSON. Кажется, все работает нормально, но когда я проверяю параметры через журналы рельсов, я заметил что-то странное. По какой-то причине дополнительный параметр отправляется на бэкэнд, который я не могу объяснить. Вот журналы я вижу, когда я называю эту конечную точку из мобильного клиента:Ruby on Rails - метод PUT создает дополнительные пароли Entry

Parameters: {"enable_security"=>true, "id"=>"7d7fec98-afba-4ca9-a102-d5d71e13f6ce", "user"=>{}} 

Как можно видеть выше дополнительный "user"=>{} добавляется к списку записей параметров. Я вижу это, когда я распечатываю объект params. Я не могу объяснить, откуда это происходит. Я также проверил мобильный клиент только для того, чтобы быть в безопасности, и нет места в коде, где я отправляю параметр с ключом user. Это очень озадачивает меня и заставляет меня думать, что мне не хватает чего-то довольно простого. Почему существует пустой объект с ключом user, который отправляется на серверный RESTful API?

Обновление предоставить больше информации

Вот код, который вызывается, когда пользователь нажимает конечную точку, которая обновляет пользователю User модель:

#PUT /:id/user/update_security_settings 
    def update_security_settings 
    @user = User.find_by_id(params[:id]) 
    @user.advanced_security_enabled = params[:enable_security] 

    respond_to do |format| 
     if @user.save 
     response = {:status => "200", :message => "User's security settings updated."} 
     format.json { render json: response, status: :ok } 
     else 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Обновление в ответ на комментарии Пользователя

Вот маршруты, которые относятся к user_controller, контроллеру вида, которые определяют все конечные точки, которые занимаются созданием и обновлением модели User.

post '/user/upload_profile', to: 'user#upload_profile' 
get '/:id/user', to: 'user#find_user' 
put '/:id/user/update_security_settings', to: 'user#update_security_settings' 
resources :user, :defaults => { :format => 'json' } 
+1

Можете ли вы опубликовать форму, из которой вы отправляете, i beilive там есть User.new, если я не ошибаюсь. – coderhs

+0

Существует нет формы его RESTFul api. Я могу опубликовать код, который вызывается при ударе оконечной точки? Это ты имел в виду? @Coderhs – ScottOBot

ответ

3

Этот комментарий действительно отражает ваш фактический маршрут?

#PUT /:id/user/update_security_settings

Я бы ожидать, что это будет /user/:id/update_security_settings вместо этого.

Можете ли вы показать нам свою конфигурацию/routes.rb - Моя дикая догадка заключается в том, что ваши маршруты каким-то образом настроены на ожидание действительного вложенного параметра пользователя, который вы не отправляете (конечно), и поэтому в журналах пусто. ,

Обновление: Некоторые из ваших маршрутов необычны. Вам действительно не нужен маршрут find_user, поскольку он должен быть включен под resources :user в качестве действия show (при условии, что вы определили метод show в своем контроллере, который является способом по умолчанию для извлечения одного элемента ресурса, поэтому нет необходимости в find_user)

Для настраиваемых маршрутов, таких как действие update_security_settings, я предлагаю придерживаться шаблона по умолчанию, например resource/:id/action, и вложить его в маршрут по умолчанию. Помещение идентификатора до ресурса очень необычно, сбивает с толку и может быть связано с вашей проблемой (я не уверен в этом). Попробуйте очистить свой routes.rb Лик это:

# notice that resources expects the plural form :users 
resources :users do 
    member do 
    patch :update_security_settings 
    post :upload_profile 
    # any other custom routes 
    end 
end 

Это приведет к маршрутам, как GET /users (индекс), GET /users/1 (шоу) и PATCH /users/1/update_security_settings.

Подробнее о маршрутизации можно найти здесь: Rails Guides | Routing From The Outside In

Пожалуйста, проверьте, если изменения выше удалить пустой из параметров пользователя.

+0

Эй @thirdsun Я отправил маршруты, связанные с контроллером, о котором идет речь. Я прошу прощения, если мои URL-адреса немного нетрадиционные. У меня нет никакого формального обучения с Ruby on Rails и я не знаю многих общих правил кодирования и лучших практик. – ScottOBot

+0

@ScottOBot Спасибо, я обновил свой ответ. Опять же, я предполагаю, что необычный дизайн маршрута (например: id перед пользователем) вводит неожиданные/странные параметры. – thirdsun

0

Проверьте конфигурацию в

config/initializers/wrap_parameters.rb 

wrap_parameters format: [] этот список не должен содержать JSON тогда он будет обернуть параметры в корень вас контроллер для всех запроса JSon. Refer api docs