ActiveResource отправляет вместо того, чтобы ставить через приложение, но не командную строку - PullRequest
0 голосов
/ 06 февраля 2012

У меня есть приложение на основе ActiveResource (называемое клиентом), которое взаимодействует с приложением API (называемым api).

У меня есть экземпляр модели, я обновляю экземпляр через форму, форму помещает клиенту с помощью простого контроллера, подобного этому:

def update
  @current_user.update_attributes(:psset => params[:permissions])
end

Вместо того, чтобы идти к контроллеру обновлений в API, контроллер обновлений передает ПОЗДРАВЛЯЮЩЕМУ контроллеру в API, а не обновлению, то есть вызывает POST для / users вместо PUT для / users /: id. форма всегда отправляется на этот контроллер, поэтому форма отправляет клиенту должным образом.

Самая сводящая с ума часть - то, что выполнение команды

@current_user.update_attributes(:psset => params[:permissions])

изнутри pry с той же средой для того же ресурса будет PUT в / users /: id на API.

Итак, что-то в этом контроллере обновлений при вызове update_attributes отлавливает это как попытку зарегистрировать новый ресурс и перейти к созданию на API.

Я озадачен тем, почему я не могу обновить с контроллера, но могу из экземпляра командной строки. Это первый случай в этой ситуации с этим контроллером, поэтому в какой-то момент я должен что-то делать, что запускает новый ресурс, но не может понять, что именно. Как обычно, я попытаюсь заполнить более конкретный код на основе вопросов. Я знаю, что, наверное, просто упускаю что-то глупое, но что?

РЕДАКТИРОВАТЬ: запрошенные соответствующие маршруты

апи:

   resources :users do       #, :only => [:index, :show, :create, :destroy]
    collection do
    end
   end

клиент:

   resources :user, :only => [ :show, :update, :destroy ]

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

После настройки маршрутов и еще много чего, проблема сохраняется. Я правильно отправляю на клиентский маршрут, этот клиентский маршрут идет для создания нового ресурса, а не для обновления существующего (даже если он использует параметры, которые он будет использовать для обновления).

UGH, нашел ответ вроде. Я начал использовать гем cached_resource с этим клиентом и недавно включил его для всех моделей. Выключил его для пользовательской модели, проблема исчезла. Опять решения для кэширования в будущем.

1 Ответ

0 голосов
/ 09 февраля 2012

Следующая логика активных ресурсов: update_attributes

Файл activeresource / lib / active_resource / base.rb, строка 1306

def update_attributes(attributes)
  load(attributes, false) && save
end
# File activeresource/lib/active_resource/base.rb, line 1147
    def save
      new? ? create : update
    end

так что может постить или ставить зависит от результата нового? метод вот этот метод (зависит от того, сохранился)

Файл activeresource / lib / active_resource / base.rb, строка 1047

def new?
  !persisted?
end

Объяснение здесь http://api.rubyonrails.org/classes/ActiveResource/Base.html#method-i-persisted-3F

...