Необходимо проверить, существует ли электронная почта, а затем обновить запись, если она естьРельсы - PullRequest
0 голосов
/ 26 мая 2018

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

Контроллер:

def update
    @contact = Contact.new(contact_params)

        if @contact.update then
            redirect_to :root, notice: 'yes was successfully updated.'
            else
            render "new"
            end
        render "show"
    end

Модель:

class Contact < ApplicationRecord
has_attached_file :image, styles: {large: "600x600>", medium: "300x300>", thumb: "150x150#"}
    validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
    #validates :email, uniqueness: true
    validates :email, presence: true
end }

Определенно знаю, что с этим что-то не так, и любезно хотел бы помочь.

Спасибо!

1 Ответ

0 голосов
/ 26 мая 2018

Определенно, здесь есть много вещей, которые нужно улучшить, сначала позвольте мне четко ответить на ваш вопрос:

validates: email, uniqueness: true 

При добавлении этой проверки в вашу модель контакта метод обновления вернет false, чтобы электронное письмоне будет обновляться.Вы также можете игнорировать case_sensitivity, добавив case_sensitive: false к проверке.Следует помнить, что эта проверка не гарантирует уникальности, если у вас несколько серверов / серверных процессов (например, запущен Phusion Passenger, несколько Mongrels и т. Д.) Или многопоточный сервер.Пожалуйста, проверьте этот ответ для расширенного объяснения.

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

1) Метод обновлениятребует передачи 1 аргумента, поэтому ваш код будет выдавать ArgumentError.

2) render появляется более одного раза в одном и том же методе: Это приведет к следующей ошибке

Рендеринг и / или перенаправление вызывались несколько раз в этом действии.Обратите внимание, что вы можете вызывать только перенаправление render или не более одного раза за действие.Также обратите внимание, что ни перенаправление, ни рендеринг не прекращают выполнение действия, поэтому, если вы хотите выйти из действия после перенаправления, вам нужно выполнить что-то вроде «redirect_to (...) и return».

Вам нужно будет выполнить рефакторинг своего кода там.

Для redirect_to: root, сначала убедитесь, что вы настроили корневой маршрут.

3) Эта строка Contact.new(contact_params) не возвращает существующую запись.Новый метод создает экземпляр объекта, поэтому вы ничего не будете обновлять там.

Возможное решение для вашего метода может быть:

helper_method :contact

def update
  if contact.update(contact_params)
    flash[:success] = "Contact updated"
    redirect_to :root
  else
    render :edit
  end   
end

private

def contact
  @contact ||= Contact.find(params[:id])
end

Надеюсь, это поможет.

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