Estou usando o Devise em um aplicativo Rails 3, mas nesse caso, um usuário deve ser criado por um usuário existente, que determina quais permissões ele terá.
Por isso, eu quero:
- Para remover a rota para os usuários se inscreverem .
- Para permitir que os usuários editem seus perfis (altere o endereço de e-mail e a senha) depois de se inscreverem
Como posso fazer isso?
Atualmente, estou removendo efetivamente essa rota colocando o seguinte antes devise_for :users
:
match 'users/sign_up' => redirect('/404.html')
Isso funciona, mas imagino que há uma maneira melhor, certo?
Atualizar
Como Benoit Garret disse, a melhor solução no meu caso é pular a criação das rotas de registros em massa e apenas criar as que eu realmente quero.
Para fazer isso, executei primeiro rake routes
e depois usei a saída para recriar as que eu queria. O resultado final foi o seguinte:
devise_for :users, :skip => [:registrations]
as :user do
get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
put 'users' => 'devise/registrations#update', :as => 'user_registration'
end
Observe que:
- Eu ainda tenho
:registerable
no meuUser
modelo devise/registrations
lida com a atualização de email e senha- A atualização de outros atributos do usuário - permissões, etc. - é tratada por um controlador diferente
Resposta real:
Remova a rota para os caminhos padrão do Devise; ou seja:
devise_for :users, path_names: {
sign_up: ''
}
ruby-on-rails-3
routing
devise
Nathan Long
fonte
fonte
https://example.com/users/
. Veja minha resposta abaixo.Respostas:
Eu tentei fazer isso também, mas um tópico no grupo do Google ideal me dissuadiu de procurar uma solução realmente limpa.
Vou citar José Valim (o mantenedor do Devise):
A pergunta original era:
fonte
:skip => :registrations
não é:skip => :registerable
.você pode fazer isso no seu modelo
altere para:
observe que o símbolo
:registerable
foi removidoÉ isso, nada mais é necessário. Todas as rotas e links para a página de registro também são removidos magicamente.
fonte
edit_user_registration
qual eu preciso. Como eu disse, "eles ainda devem poder editar seus perfis".localhost:3000/admin
onde podem editar suas contas, mesmo com o objeto resistente removido. Se essa não é uma solução viável, dê uma olhada no CanCan, que permite estipular quem pode ou não acessar um recurso. Costumo adicionar funções como 'admin' ou 'moderator' e bloquear todos os outros nas páginas de inscrição.sign_in
na produção?Eu tive um problema semelhante tentei remover os caminhos devise_invitable para create e new :
antes:
rotas de ancinho
depois de
rotas de ancinho
note 1 criar escopo https://github.com/plataformatec/devise#configuring-routes
note 2 Estou aplicando-o no devise_invitable, mas ele funcionará com qualquer recurso ideal *
Nota importante: veja que o devise_scope está no usuário, não nos usuários ? está correto, cuidado com isso! Pode causar muita dor, causando esse problema:
fonte
Encontrei outro post semelhante a este e queria compartilhar uma resposta que @chrisnicola deu. Na postagem, eles estavam tentando bloquear apenas inscrições de usuários durante a produção.
Você também pode modificar o controlador de registros. Você pode usar algo como isto:
Em "app / controllers / registrations_controller.rb"
Isso substituirá o controlador do dispositivo e usará os métodos acima. Eles adicionaram mensagens em flash, caso alguém de alguma forma tenha acessado a página de inscrição. Você também deve poder alterar o redirecionamento para qualquer caminho que desejar.
Também em "config / routes.rb" você pode adicionar isto:
Deixar assim permitirá que você use o dispositivo padrão para editar seu perfil. Se desejar, você ainda pode substituir a opção de editar perfil incluindo
no "app / controllers / registrations_controller.rb"
fonte
Essa é uma pergunta antiga - mas recentemente resolvi o mesmo problema e criei uma solução muito mais elegante que:
E fornece os nomes padrão para as rotas nomeadas (como
cancel_user_registration
) sem ser excessivamente detalhado.rake routes
saída com os módulos de criação padrão:fonte
Você pode substituir o "devise_scope" colocando-o antes do "devise_for".
Não tenho certeza se essa é a melhor maneira, mas é a minha solução no momento, pois ela é redirecionada de volta para a página de login.
fonte
/users/sign_up
, terá acesso ao endereçosites#index
nãosign_up
mas ainda permanece/users/sign_up
.Gostei da resposta do @ max , mas ao tentar usá-lo, encontrei um erro devido a
devise_mapping
ser nulo.Modifiquei sua solução levemente para uma que pareça resolver o problema. É necessário encerrar a chamada para
resource
dentrodevise_scope
.Observe que
devise_scope
espera o singular,:user
enquantoresource
espera o plural:users
.fonte
Faça isso em routes.rb
agora você receberá um erro ao entrar na página de entrada para corrigi-lo. Faça essa alteração em: app / views / devise / shared / _links.erb
fonte
devise_for
oas
bloco e) e tive que removê-lo:registerable
no modelo.Descobri que isso funciona bem sem mexer nas rotas ou adicionar métodos de controlador de aplicativo. Minha abordagem é substituir o método ideal. Adicione isso a
app/controllers/devise/registrations_controller.rb
omiti os outros métodos por questões de brevidade.Também para remover a ilusão de que esse caminho ainda é acessível a partir de outras visualizações, você também pode querer remover esse código de
app/views/devise/shared/_links.erb
fonte
Para outros no meu caso.
Com
devise (3.5.2)
.Eu removi com êxito as rotas para inscrição, mas mantive as para editar o perfil, com o seguinte código.
fonte
Aqui está a rota um pouco diferente que eu segui. Faz com que você não precise substituir o
devise/shared/_links.html.erb
exibição.Em
app/models/user.rb
:Em
config/routes.rb
:Antes:
Depois de:
fonte
devise_for :users, skip: :all
Eu tive o mesmo problema e achei uma prática ruim redirecionar usuários da página de registro. Então, minha solução é basicamente não está usando
:registrable
nada.O que fiz foi criar uma página semelhante, como editar detalhes do usuário, com a seguinte aparência:
Portanto, este formulário é enviado para um novo ponto de extremidade da postagem que atualiza a senha, que se parece com:
Posteriormente, você pode usar o
@result
em sua exibição para informar ao usuário se a senha está atualizada ou não.fonte
Ao alterar as rotas, há muitos outros problemas que vêm com isso. O método mais fácil que encontrei é o seguinte.
fonte
Você pode modificar a
devise
gema em si. Primeiro, execute este comando para encontrar o local instalado usando:gem which devise
Vamos supor que o caminho seja:
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise
Então vá para
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise/lib/devise/rails
e editeroutes.rb
nesse diretório. Existe um método chamadodef devise_registration(mapping, controllers)
que você pode modificar para se livrar da nova ação. Você também pode remover completamente os mapeamentos paradevise_registration
fonte
gem 'devise', github: 'yourusername/devise', branch: "master"
)