Возможно, это не совсем хорошо с переводами, но вот предложение:
В вашем user_controller # create action оберните все, что у вас уже есть, с помощью оператора if. Вот грубый пример:
class UserController < ApplicationController
...
def create
if User.find(params[:email])
flash[:alert] = "This email address is in use. You can ".concat(generate_reset_password_link(params[:email])
render :action => 'new'
else
<your current code>
end
end
После этого вам придется написать вспомогательный метод generate_reset_password_link
, но я думаю, что в основном это соответствует макету MVC. Контроллер предназначен для взаимодействия с видом и моделью. Это немного нарушает принцип СУХОГО, так как вы, по сути, обходите validates_uniqueness_of :email
, но вы получаете некоторое нестандартное поведение. Мне кажется, что DRY не достижим на 100%, если вы хотите создавать более сложные приложения, но, возможно, вы можете уточнить это и доказать, что я не прав;)
Возможно, вам придется немного помассировать его, чтобы render :action => 'new'
снова заполнился ранее введенными данными (в случае, если пользователь просто набрал свой собственный адрес электронной почты, а его фактически нет в системе).
Если вы решите использовать этот подход, я бы добавил в контроллер и модель *1013*, указывающий, что уникальность электронной почты по существу проверяется в 2 местах. Если кто-то еще захочет взглянуть на этот код, он поможет им понять и поддерживать его.