Spaghetti Rails Routing e convite Codificação Bolognese
-
19-09-2019 - |
Pergunta
Eu realmente não estou certo se há um único problema aqui ou eu ter abordado esta no caminho errado, mas todas as sugestões seria muito apreciada!
Na aplicação quando um usuário assina-se que recebem privilégios e sua página é criada, eles podem convidar colegas por e-mail.
O e-mail tem um código de ativação marcado na extremidade. Um exemplo url seria " / user / new / xxxxxxxxx ".
Aqui está o problema: Preciso do colega para ser capaz de criar uma conta de usuário, bem como, com apenas suas informações básicas, para que eles possam acessar a conta e configurar seu canto do aplicativo .
Quando o colega comete um erro para o usuário se inscrever forma, os esquece url existe um código de ativação, e salta para trás com mensagens de validação e um url bonita nua de '/ usuários'. Quando o colega altera seus erros e cliques se inscrever, eles são submetidos como um usuário de pleno direito, não um colega convidou.
Isso acontece porque eu tenho um se cláusula relativa à 'usuários / nova' página
<% if @activation_code %>
Show colleague messages of invitation and happiness
<% else %>
Show fully fledged user ego stroking messages
<% end %>
Meu roteamento para encontrar o parâmetro código da url é:
map.signup '/users/new/:code', :controller => 'users', :action => 'new', :code => nil
Como eu disse antes, tenho abordado este completamente errado? é se há um problema aqui?
Atualizar Este Rails Episódio Elenco Resolvido quase todos os problemas que eu tinha: Beta Convites
Apesar de distinguir se a pessoa estava vindo de um convite ou não eu usei apenas este bloco condições:
if !@user.invitation_id.blank?
e que funcionou muito bem.
Solução
Im adivinhando seus olhares controlador como este:
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
O problema é que você não tem o @activation_code na vista mais. Então, eu sugiro que você passe a volta activation_code em um campo de formulário oculto.
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
Desta forma, quando você processar a visão "nova" a partir da ação criar a sua visão ainda terá a @activation_code necessário para ajudar a tornar os elementos condicionais apropriados.
Outras dicas
Uma vez que visitaram a página usando o código de confirmação, você pode considerar incluindo o código de confirmação em uma tag <input type="hidden" />
para garantir que ele é salvo entre postbacks.
Caso contrário, é necessário modificar a ação para o seu formulário de inscrição para incluir o código de ativação; algo como isto:
form_for @user, :url => "/users/new/#{@activation_code}" do |f|
# ...
end