#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
, где я определяю предлагаемое действие там.