Какое действие я должен использовать для операции create_or_update

#ruby-on-rails #rest #crud

#ruby-on-rails #отдых #crud

Вопрос:

В Rails есть базовая операция REST create / update / show / destroy, но если я хочу действие, которое создает или обновляет существующую запись, должен ли я создать для этого свое пользовательское действие?

Я знаю, что у rails есть first_or_initialize , но, похоже, это не вписывается в определение create или update .

В моем понимании create следует создать новую запись, а не обновлять существующую, и update ее следует обновлять без создания новой.

Вот пример:

У меня есть модель Blog , Tag , и таблица соединений Blog_Tags , которая ссылается на blog_id , tag_id , и user_id для записи, кто предлагает этот тег для этого сообщения в блоге.

 [Blog]>-[Blog_Tag]-<[Tag]
             |
         [User]
 

Моя мысль

Я думаю о новом действии PUT create_or_update для этого примера, и маршрут будет таким, и у меня есть маршруты blog/[blog_id]/tag/[tag_id_to_add]/create_or_update . Не знаю, правильно это или нет.

Комментарии:

1. Нет. Не пытайтесь добавлять свои собственные методы. Не делайте странных вещей, чтобы избежать множественных запросов. Кроме того, PUT может быть тем, что вы хотите. Он создаст ресурс с заданным URI или обновит (заменит) существующий ресурс с этим URI.

Ответ №1:

Помещение его в create или update не имеет значения. Я бы выбрал update, поскольку метод будет вызывать update. Просто убедитесь, что четко задокументировано, что действие может создавать и обновлять модель.

 def update
   user = User.find_or_initialize_by(email: user_params[:email])
   user.update_attributes(user_params)
end
 

Что касается глагола, действие обновления для определенного ресурса по умолчанию должно содержать глаголы POST / PUT .

Ответ №2:

Вы можете использовать: find_or_initialize или find_or_create

 For example, in Rails 4 syntax:

  blog = Blog.find_or_initialize_by(name: "abc")
  blog.update(name: "xyz")

Rails 3:

  blog = Blog.find_or_initialize_by_name("abc")
  blog.update_attributes(name: "xyz")
 

Если запись инициализирована заново, update или update_attributes попытаются ее сохранить.

Вы можете прочитать эту ссылку http://apidock.com/rails/v4.0.2/ActiveRecord/Relation/find_or_create_by

Ответ №3:

В итоге у меня есть путь, подобный blog/[blog_id]/tag/[tag_id]/suggest, который переходит к выделенному контроллеру SuggestionController , где я определяю предлагаемое действие там.