Проблема проверки Rails - PullRequest
       3

Проблема проверки Rails

0 голосов
/ 11 сентября 2011

У меня есть модель User с тремя полями: электронная почта,: display_name и: handle. Дескриптор создается за кулисами из: display_name.

Я использую следующие проверки:

 validates :display_name, :presence => :true, :uniqueness => { :message => "Sorry, another user has already chosen that name."}, :on => :update
  validates :email, :presence => :true, :uniqueness => { :message => "An account with that email already exists." }

Я использую ручку как to_param в модели. Если пользователь не проходит проверку, отправив: display_name, которое уже существует, затем пытается изменить его и повторно отправить форму, Rails, кажется, использует новый дескриптор в качестве проверки для электронной почты - другими словами, он предполагает, что электронная почта не не принадлежат текущему пользователю, и проверка по электронной почте не проходит. На этом этапе Rails предполагает, что измененное отображаемое имя / дескриптор используется для поиска, а действие обновления вообще не может быть выполнено, потому что не может найти пользователя на основе нового дескриптора.

Вот метод обновления:

def update
    @user = User.find_by_handle(params[:id])
    @handle = params[:user][:display_name]
    @user.handle = @handle.parameterize
  ...
end

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

1 Ответ

2 голосов
/ 11 сентября 2011

может быть, я должен попытаться установить ручку в модели?

^ This.

Контроллер не место, чтобы делать что-то подобное.Если это логика модели, которая происходит за сценой, вне контроля пользователя, зачем помещать это в код контроллера?

Сделайте это вместо этого в фильтре before_save, который гарантированно будет работать только после того, как выбранное отображаемое имя будет признано доступным, и запись будет считаться действительной.Таким образом, handle не будет изменено в кэшированной записи до тех пор, пока оно фактически не будет передано в базу данных, что устраняет проблему неправильно сгенерированного URL.

before_save :generate_handle
...

def generate_handle
  self.handle = display_name.parameterize
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...