Предотвращение UPDATE записи в приложении Rails, где поля не изменены - PullRequest
0 голосов
/ 09 апреля 2019

Я ищу способ запретить пользователям нажимать кнопку обновления для метода Update в моем приложении Rails, если они не изменили никаких значений.Если они не изменяют никаких значений, мой метод UPDATE запишет пустые значения в некоторые поля, поэтому, если пользователь не изменяет какие-либо данные и просто нажимает кнопку обновить, мне нужно приложение, чтобы предотвратить обновление записи.

Буду признателен за любые предложения.

К вашему сведению, это стандартный метод обновления печенья:

def update
    if @client.update(client_params)
      redirect_to @client, notice: 'Client was successfully updated.'
    else
      render :edit
    end
  end

Ответы [ 4 ]

4 голосов
/ 09 апреля 2019

По умолчанию в Rails метод UPDATE будет выполняться только в случае изменения какого-либо одного значения.Если значение поля не изменено, метод UPDATE не будет выполнять запрос, просто проверьте и верните результат.

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

Postman update request console log for first update(no values changed)

Я только что изменил одно из значений поля - внутренний статус console log where only modified value is updated Postman update request for new value

Примечание : в обновлении лучше отправлятьстарые значения, чтобы избежать хранения пустых значений в базе данных. Обновление ожидает все параметры, определенные в client_params в вашем случае.Если отправляются пустые параметры, включите нулевую проверку или проверку, чтобы избежать того же.Вы также можете написать собственный метод обновления для того же.

1 голос
/ 11 апреля 2019

Можете ли вы предварительно заполнить форму с существующими значениями? Таким образом, если нажата кнопка «обновить», форма отправит то, что было раньше, вместо пустых значений, и запись не будет заполнена пустыми данными. Это также хороший UX, чтобы показать пользователям существующие значения в формах редактирования.

1 голос
/ 09 апреля 2019

Для достижения цели можно использовать методы attributes= и changed? вместе.

attributes= mass присваивает значения из хэша экземпляру модели.changed? возвращает true, если какое-либо значение в модели изменило его значение.

Возьмите следующий пример:

[1] pry(main)> u = User.all.sample # this returns a random user
=> #<User id: 1319, email: "bob@test.com">
[2] pry(main)> u.changed?
=> false
[3] pry(main)> u.attributes = { email: "bob@test.com" }
=> {:email=>"bob@test.com"}
[4] pry(main)> u.changed?
=> false
[5] pry(main)> u.email
=> "bob@test.com"
[6] pry(main)> u.attributes = { email: "alice@test.com" }
=> {:email=>"alice@test.com"}
[7] pry(main)> u.changed?
=> true
[8] pry(main)> u.email
=> "alice@test.com"
[9] pry(main)> u.save
=> true

При применении к вашему фрагменту кода.

def update
  @client.attributes = client_params

  if @client.changed? && @client.save
    redirect_to @client, notice: 'Client was successfully updated.'
  else
    render :edit
  end
end
0 голосов
/ 09 апреля 2019

Нет необходимости добавлять пользовательские условия, чтобы проверить, были ли изменены ваши атрибуты или нет, потому что Rails обрабатывает ByDefault .

Если измененный объект Active Record был получен, он будет сохранен в базе данных, в противном случае никакие операции не будут выполнены. Для лучшего понимания вы можете самостоятельно проверить консоль, выполнив оба запроса.

Для предотвращения хранения пустых значений в базе данных. Пожалуйста, проверьте, используете ли вы типы методов «PATCH» для обновления записи или нет.

Потому что это возможно только при одном условии:

использование метода 'PUT' для обновления записи и предоставления только измененных атрибутов 'key-pair' рельсы. Rails сохранит другое не указанное «ключ-значение» атрибуты с пустыми значениями.

В Rails у нас есть два типа методов для метода «Update».

  1. PUT

(обновить всю или только часть записи.)

  1. PATCH

можно обновить только частичную запись

Чтобы следовать лучшей семантике HTTP, Rails будет использовать HTTP-глагол PATCH для обновлений. PATCH допускает как полное, так и частичное обновление ресурса, и больше подходит для того, как Rails обновляет ресурсы. Если вы обновляете существующее приложение Rails, HTTP-глагол PUT все равно будет сопоставлен с действием обновления в RESTful маршруты, но рекомендуется использовать PATCH для продвижения вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...