Devise kaydı denetleyicisini geçersiz kıl


236

Ben farklı bir modeline dayanmaktadır kayıt formuna bir alan eklemiş, bkz ben vasiyetle modeli ile iç içe özelliklerini kullanmak yapmak nasıl kanlı detaylar için. Bu bölüm iyi çalışıyor.

Şimdi sorun kaydettiğimde, Activerecord::UnknownAttributeErrorbu alanda (şirket) bir cihaz ile sağlanan kayıt denetleyicisinin oluşturma eyleminde başarısız oluyor .

Kayıt denetleyicisini geçersiz kılmam gerektiğini varsayıyorum ya da buna yaklaşmamın daha iyi / daha kolay bir yolu var mı?


Yanıtlar:


354

Formunuzda, kullanıcı modelinize ait olmayan toplu atama veya iç içe geçmiş modellerin herhangi bir başka özelliğini mi geçiyorsunuz?

Eğer öyleyse, ActiveRecord :: UnknownAttributeError bu örnekte tetiklendi inanıyorum.

Aksi takdirde, böyle bir şey üreterek sadece kendi denetleyicinizi oluşturabileceğinizi düşünüyorum:

# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
  def new
    super
  end

  def create
    # add custom create logic here
  end

  def update
    super
  end
end 

Ardından, cihazla varsayılan yerine o denetleyiciyi kullanmasını söyleyin:

# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}

3
Peki, aygıtın görünümler için tasarlanan dizinde görünmesini nasıl sağlıyorsunuz? Bunu deniyorum ama "sign_in_and_redirect (kaynak_adı, kaynak)" gibi yöntemler tasarlamak şablon görünümlerinde arıyoruz.
Kasım'da

7
Cihaz görünümlerinizi özelleştirmek istiyorsanız, önce bunları oluşturmanız gerekir ve cihaz, görünümleri gem'ten yüklemeden önce görünümler klasörünüzü kontrol edecektir. Rails 3'te: rails generate devise:viewsve Rails 2'de (sanırım):script/generate devise:views
theTRON

2
Yukarıdaki kesmek, sürüm 2 için çalışan devise 1.0.8 ile çalışmaz.
William Yeung

18
Bunun gibi bir Devise denetleyicisini geçersiz kılarsanız, app / views / devise / kayıtlarından tüm görünümleri app / views / kayıtlara / (hangi denetleyiciyi geçersiz kıldığınız için değiştirin) olarak kopyaladığınızdan emin olun.
Jamie Cobbett

31
Alternatif olduklarını ve eklemek için vasiyetle görüşlerini bırakabilir paths.app.views << "app/views/devise"Gözlerinde farklı config/application.rb.
theTRON

66

Ad alanlarını kullanarak denetleyicileri ve görünümleri geçersiz kılmanın daha iyi ve daha organize bir yolu:

Aşağıdaki klasörleri oluşturun:

app/controllers/my_devise
app/views/my_devise

Geçersiz kılmak istediğiniz tüm denetleyicileri app / controllers / my_devise içine koyun ve MyDevisedenetleyici sınıf adlarına ad alanı ekleyin . Registrationsmisal:

# app/controllers/my_devise/registrations_controller.rb
class MyDevise::RegistrationsController < Devise::RegistrationsController

  ...

  def create
    # add custom create logic here
  end

  ...    

end 

Rotalarınızı buna göre değiştirin:

devise_for :users,
           :controllers  => {
             :registrations => 'my_devise/registrations',
             # ...
           }

Gerekli tüm görünümleri app/views/my_deviseDevise gem klasöründen kopyalayın veya kullanın rails generate devise:views, geçersiz kılmadığınız görünümleri silin ve deviseklasörü yeniden adlandırın my_devise.

Bu şekilde her şeyi düzgün bir şekilde iki klasörde düzenleyeceksiniz.


1
Bu benim yaklaştığım yaklaşıma benziyor, ama createDevise'nin üzerine yazdığım metoda hangi özel mantığın koyulacağını bilmiyorum . Değiştirdiğim iskele tarafından oluşturulan denetleyicim harika çalışıyor, ancak Devise'nin işiyle nasıl çalışmasını sağlıyorsunuz resource?
Kyle Carlson

@Vincent teşekkür ederim - sadece bir yöntemi geçersiz kılmak istersem, sadece geçersiz kılmak istediğim yöntemi yazar mıyım - ve diğer her şey normal olarak çalışır mı? Yardımınız çok takdir edildi
BKSpurgeon

MyDevise::RegistrationsController < Devise::RegistrationsControllerdöngüsel bağımlılık hatası oluşturur. Yanlış bir şey mi yapıyorum?
ianrandmckenzie

34

RegistrationsController'ı yeniden yazmaktan daha iyi bir çözüm olduğuna inanıyorum. Tam olarak aynı şeyi yaptım (Şirket yerine Organizasyonum var).

Yuvalanmış formunuzu, model ve görünüm düzeyinde düzgün bir şekilde ayarlarsanız, her şey bir cazibe gibi çalışır.

Kullanıcı modelim:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable, :lockable and :timeoutable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  has_many :owned_organizations, :class_name => 'Organization', :foreign_key => :owner_id

  has_many :organization_memberships
  has_many :organizations, :through => :organization_memberships

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :username, :owned_organizations_attributes

  accepts_nested_attributes_for :owned_organizations
  ...
end

Organizasyon Modelim:

class Organization < ActiveRecord::Base
  belongs_to :owner, :class_name => 'User'
  has_many :organization_memberships
  has_many :users, :through => :organization_memberships
  has_many :contracts

  attr_accessor :plan_name

  after_create :set_owner_membership, :set_contract
  ...
end

Benim görüşüm: 'tasarım / kayıtlar / new.html.erb'

<h2>Sign up</h2>

<% resource.owned_organizations.build if resource.owned_organizations.empty? %>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>

  <p><%= f.label :name %><br />
    <%= f.text_field :name %></p>

  <p><%= f.label :email %><br />
    <%= f.text_field :email %></p>

  <p><%= f.label :username %><br />
    <%= f.text_field :username %></p>

  <p><%= f.label :password %><br />
    <%= f.password_field :password %></p>

  <p><%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation %></p>

  <%= f.fields_for :owned_organizations do |organization_form| %>

    <p><%= organization_form.label :name %><br />
      <%= organization_form.text_field :name %></p>

    <p><%= organization_form.label :subdomain %><br />
      <%= organization_form.text_field :subdomain %></p>

    <%= organization_form.hidden_field :plan_name, :value => params[:plan] %>

  <% end %>

  <p><%= f.submit "Sign up" %></p>
<% end %>

<%= render :partial => "devise/shared/links" %>

3
Yapı mantığını görünümden modele taşımak daha temiz olurdu, bkz. Stackoverflow.com/questions/3544265#3764837
meleyal

Aygıt denetleyicileri oluşturdum ve şimdi kullanıcı Kaydol'u tıklattığında denetleyici eylemi oluşturmaya başladım. Şifreyi şifrelemek ve şifre ve diğer alanların arka uç kontrollerini yapmak için Devise'yi kullanabileceğim bir yol var mı (geçersiz kılma / bazı örnek kod gibi)? ve model veritabanına kaydetme?
HP

resourceSınıf örneği değişkeni yerine görünümdeki yerel değişkene nasıl erişebilirsiniz @resource?
Chloe

12

Özelleştirme için görünümler ve denetleyiciler oluşturabilirsiniz.

kullanım

rails g devise:controllers users -c=registrations

ve

rails g devise:views 

Belirli denetleyicileri ve görünümleri gem'ten uygulamanıza kopyalar.

Ardından, yönlendiriciye bu denetleyiciyi kullanmasını söyleyin:

devise_for :users, :controllers => {:registrations => "users/registrations"}

11

Çok basit yöntemler Sadece terminale ve aşağıdaki tipe gidin

rails g devise:controllers users //This will create devise controllers in controllers/users folder

Özel görünümleri kullanmanın yanında

rails g devise:views users //This will create devise views in views/users folder

şimdi route.rb dosyanızda

devise_for :users, controllers: {
           :sessions => "users/sessions",
           :registrations => "users/registrations" }

Başka denetleyiciler de ekleyebilirsiniz. Bu, kullanıcılar klasöründeki denetleyicileri ve kullanıcılar klasöründeki görünümleri kullanacak şekilde tasarlanır.

Artık görünümlerinizi isteğiniz gibi özelleştirebilir ve mantığınızı denetleyiciler / kullanıcılar klasöründeki denetleyicilere ekleyebilirsiniz. Zevk almak !

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.