Saya menggunakan Devise dalam aplikasi Rails 3, tetapi dalam hal ini, pengguna harus dibuat oleh pengguna yang ada, yang menentukan izin apa yang akan ia miliki.
Karena itu, saya ingin:
- Untuk menghapus rute bagi pengguna untuk mendaftar .
- Agar pengguna tetap dapat mengedit profil mereka (mengubah alamat email dan kata sandi) setelah mereka mendaftar
Bagaimana saya bisa melakukan ini?
Saat ini, saya secara efektif menghapus rute ini dengan menempatkan yang berikut sebelumnya devise_for :users
:
match 'users/sign_up' => redirect('/404.html')
Itu berhasil, tapi saya membayangkan ada cara yang lebih baik, bukan?
Memperbarui
Seperti yang dikatakan Benoit Garret, solusi terbaik dalam kasus saya adalah tidak membuat rute registrasi secara massal dan hanya membuat yang saya inginkan.
Untuk melakukan itu, saya pertama berlari rake routes
, kemudian menggunakan output untuk membuat kembali yang saya inginkan. Hasil akhirnya adalah ini:
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
Perhatikan bahwa:
- Saya masih memiliki model
:registerable
sayaUser
devise/registrations
menangani pembaruan email dan kata sandi- Memperbarui atribut pengguna lain - izin, dll - ditangani oleh pengontrol yang berbeda
Jawaban aktual:
Hapus rute untuk jalur Rencanakan default; yaitu:
devise_for :users, path_names: {
sign_up: ''
}
sumber
https://example.com/users/
. Lihat jawaban saya di bawah ini.Jawaban:
Saya mencoba melakukan ini juga, tetapi utas pada grup google yang dirancang membuat saya tidak mencari solusi yang benar-benar bersih.
Saya akan mengutip José Valim (pengelola Rancangan):
Pertanyaan aslinya adalah:
sumber
:skip => :registrations
tidak:skip => :registerable
.Anda dapat melakukan ini dalam model Anda
ubah ke:
perhatikan bahwa simbol
:registerable
telah dihapusItu saja, tidak ada lagi yang diperlukan. Semua rute dan tautan ke halaman pendaftaran juga dihapus secara ajaib.
sumber
edit_user_registration
, yang saya butuhkan. Seperti yang saya katakan, "mereka masih dapat mengedit profil mereka."localhost:3000/admin
tempat mereka dapat mengedit akun mereka, bahkan dengan objek yang dapat disimpan ulang dihapus. Jika itu bukan solusi yang layak, maka lihatlah CanCan yang memungkinkan Anda menentukan siapa yang dapat dan tidak dapat mengakses sumber daya. Saya cenderung menambahkan peran seperti 'admin' atau 'moderator' dan mengunci orang lain dari halaman sign_up.sign_in
produksi?Saya memiliki masalah serupa yang mencoba menghapus jalur devise_invitable untuk buat dan baru :
sebelum:
rute menyapu
setelah
rute menyapu
note 1 merancang ruang lingkup https://github.com/plataformatec/devise#configuring-routes
note 2 Saya menerapkannya pada devise_invitable tetapi akan bekerja dengan semua fitur * yang mampu
Catatan penting: lihat bahwa devise_scope berada di pengguna bukan pengguna ? benar, hati-hati! Ini dapat menyebabkan banyak rasa sakit memberi Anda masalah ini:
sumber
Saya menemukan posting lain yang mirip dengan yang ini dan ingin membagikan jawaban yang diberikan @chrisnicola. Dalam postingan itu mereka berusaha untuk hanya memblokir pendaftaran pengguna selama produksi.
Anda juga dapat memodifikasi pengontrol pendaftaran. Anda dapat menggunakan sesuatu seperti ini:
Di "app / controllers / registrations_controller.rb"
Ini akan menggantikan pengontrol devise dan menggunakan metode di atas sebagai gantinya. Mereka menambahkan pesan flash memetikan bahwa seseorang entah bagaimana berhasil masuk ke halaman sign_up. Anda juga harus dapat mengubah pengalihan ke jalur apa pun yang Anda suka.
Juga di "config / routes.rb" Anda dapat menambahkan ini:
Membiarkannya seperti ini akan memungkinkan Anda untuk menggunakan alat standar mengedit profil Anda. Jika mau, Anda masih dapat mengganti opsi edit profil dengan memasukkan
di "app / controllers / registrations_controller.rb"
sumber
Ini adalah pertanyaan lama - tetapi saya baru saja menyelesaikan masalah yang sama dan menemukan solusi yang jauh lebih elegan daripada:
Dan itu memberikan nama default untuk rute yang dinamai (seperti
cancel_user_registration
) tanpa terlalu banyak bertele-tele.rake routes
output dengan modul alat bawaan:sumber
Anda dapat mengganti "devise_scope" dengan menempatkannya di depan "devise_for".
Tidak yakin apakah ini cara terbaik tetapi ini solusi saya saat ini, karena hanya akan diarahkan kembali ke halaman masuk.
sumber
/users/sign_up
maka Anda akan dapat mengaksessites#index
notsign_up
tapi alamat tetap ada/users/sign_up
.Saya menyukai jawaban @ max , tetapi ketika mencoba menggunakannya saya mengalami kesalahan karena
devise_mapping
tidak ada.Saya memodifikasi solusinya sedikit ke yang tampaknya mengatasi masalah ini. Perlu membungkus panggilan ke
resource
dalamdevise_scope
.Perhatikan bahwa
devise_scope
mengharapkan bentuk tunggal:user
sedangkanresource
mengharapkan bentuk jamak:users
.sumber
Lakukan ini di routes.rb
Anda akan mendapatkan kesalahan sekarang saat Anda masuk ke halaman masuk, untuk memperbaikinya. Lakukan perubahan ini di: app / views / devise / shared / _links.erb
sumber
devise_for
danas
blok) dan aku harus menghapus:registerable
dalam model.Saya menemukan ini berfungsi dengan baik tanpa mengacaukan rute atau menambahkan metode pengontrol aplikasi. Pendekatan saya adalah mengganti metode merancang. Tambahkan ini ke
app/controllers/devise/registrations_controller.rb
saya telah menghilangkan metode lain untuk singkatnya.Juga untuk menghapus ilusi bahwa jalur ini masih dapat dijangkau dari tampilan lain, Anda mungkin juga ingin menghapus kode ini
app/views/devise/shared/_links.erb
sumber
Untuk orang lain dalam kasus saya.
Dengan
devise (3.5.2)
.Saya berhasil menghapus rute untuk mendaftar, tetapi tetap yang mengedit profil, dengan kode berikut.
sumber
Inilah rute yang sedikit berbeda yang saya tempuh. Itu membuatnya sehingga Anda tidak perlu menimpa
devise/shared/_links.html.erb
tampilan.Di
app/models/user.rb
:Di
config/routes.rb
:Sebelum:
Setelah:
sumber
devise_for :users, skip: :all
Saya memiliki masalah yang sama dan saya merasa agak buruk untuk mengarahkan pengguna dari halaman pendaftaran. Jadi solusi saya pada dasarnya tidak menggunakan
:registrable
sama sekali.Apa yang saya lakukan adalah membuat halaman yang mirip seperti mengedit detail pengguna yang terlihat seperti:
Jadi formulir ini mengirimkan ke titik akhir pos baru yang memperbarui kata sandi, yang terlihat seperti:
Selanjutnya Anda dapat menggunakan
@result
dalam tampilan Anda untuk memberi tahu pengguna apakah kata sandi diperbarui atau tidak.sumber
Dengan mengubah rute ada banyak masalah lain yang datang dengan itu. Metode termudah yang saya temukan adalah melakukan hal berikut.
sumber
Anda dapat memodifikasi
devise
permata itu sendiri. Pertama, jalankan perintah ini untuk menemukan lokasi terinstal menggunakan:gem which devise
Misalkan jalannya adalah:
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise
Lalu pergi ke
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise/lib/devise/rails
dan editroutes.rb
di direktori itu. Ada metode yang disebutdef devise_registration(mapping, controllers)
yang dapat Anda modifikasi untuk menyingkirkan tindakan baru. Anda juga dapat menghapus sepenuhnya pemetaan untukdevise_registration
sumber
gem 'devise', github: 'yourusername/devise', branch: "master"
)