Маршрутизация спагетти-рельсов и кодирование приглашений Болоньезе
-
19-09-2019 - |
Вопрос
Я не совсем уверен, есть ли здесь одна проблема или я подошел к этому неправильно, но любые предложения будут очень признательны!
В приложении, когда пользователь регистрируется, он получает привилегии и настраивает свою страницу, а затем может приглашать коллег по электронной почте.
В конце письма есть код активации.Пример URL-адреса: "/пользователь/новый/xxxxxxxxx".
Вот проблема: Мне нужно, чтобы коллега также мог создать учетную запись пользователя, используя только свою основную информацию, чтобы он мог войти в учетную запись и настроить свою часть приложения.
Когда коллега допускает ошибку в форме регистрации пользователя, URL-адрес забывает, что существует код активации, и возвращается назад с сообщениями проверки и довольно пустым URL-адресом «/users».Когда коллега исправляет свои ошибки и нажимает кнопку «Зарегистрироваться», он представляется как полноправный пользователь, а не приглашенный коллега.
Это происходит потому, что у меня есть предложение if на странице «пользователи/новые».
<% if @activation_code %>
Show colleague messages of invitation and happiness
<% else %>
Show fully fledged user ego stroking messages
<% end %>
Мой маршрут для поиска параметра кода URL-адреса:
map.signup '/users/new/:code', :controller => 'users', :action => 'new', :code => nil
Как я уже говорил, я подошел к этому совершенно неправильно?здесь есть одна проблема?
ОБНОВЛЯТЬЭтот эпизод Rails Cast решил почти все мои проблемы: Приглашения на бета-тестирование
Хотя, чтобы отличить, пришёл человек по приглашению или нет, я просто использовал вот такой блок условий:
if !@user.invitation_id.blank?
и это сработало отлично.
Решение
Я предполагаю, что ваш контроллер выглядит так:
def create
if @user = User.create(params[:user]) && @user.new_record?
#take the user to where you want them to go
else
#there was an error
flash[:error] = "Oops, blah blah blah"
render :action => "new"
end
end
Проблема в том, что у вас больше нет @activation_code в представлении.Итак, я бы посоветовал вам передать код активации обратно в скрытое поле формы.
def create
@activation_code = params[:activation_code]
if @user = User.create(params[:user]) && @user.new_record?
#take the user to where you want them to go
else
#there was an error
flash[:error] = "Oops, blah blah blah"
render :action => "new"
end
end
Таким образом, когда вы визуализируете «новое» представление из действия создания, ваше представление по-прежнему будет иметь необходимый @activation_code, чтобы помочь ему отображать соответствующие условные элементы.
Другие советы
После того, как они посетили страницу с помощью кода подтверждения, вы можете рассмотреть возможность включения кода подтверждения в <input type="hidden" />
тег, чтобы гарантировать, что он сохраняется между обратными передачами.
В противном случае вам необходимо изменить действие в форме регистрации, включив в него код активации;что-то вроде этого:
form_for @user, :url => "/users/new/#{@activation_code}" do |f|
# ...
end