मैंने साइन-अप फॉर्म में एक फ़ील्ड जोड़ा है जो एक अलग मॉडल पर आधारित है, देखें मैं वसीयत मॉडल के साथ नेस्टेड विशेषताओं का उपयोग कैसे करूं खूनी विवरण के लिए। यह हिस्सा ठीक काम कर रहा है।

समस्या अब है जब मैं सहेजता हूं, यह पंजीकरण नियंत्रक की निर्माण क्रिया में विफल हो रहा है जिसे इस क्षेत्र (कंपनी) पर Activerecord::UnknownAttributeError के साथ तैयार किया जाता है।

मुझे लगता है कि मुझे पंजीकरण नियंत्रक को ओवरराइड करने की ज़रूरत है, या क्या कोई बेहतर/आसान तरीका है जिससे मुझे इस तक पहुंचना चाहिए?

239
Craig McGuff 23 अगस्त 2010, 13:32

5 जवाब

सबसे बढ़िया उत्तर

अपने फॉर्म में क्या आप किसी अन्य विशेषता में बड़े पैमाने पर असाइनमेंट के माध्यम से गुजर रहे हैं जो आपके उपयोगकर्ता मॉडल, या किसी नेस्टेड मॉडल से संबंधित नहीं है?

यदि ऐसा है, तो मेरा मानना ​​है कि इस उदाहरण में ActiveRecord::UnknownAttributeError चालू हो गया है।

अन्यथा, मुझे लगता है कि आप इस तरह कुछ उत्पन्न करके अपना खुद का नियंत्रक बना सकते हैं:

# 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 

और फिर वसीयत को डिफ़ॉल्ट के बजाय उस नियंत्रक का उपयोग करने के लिए कहें:

# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}
359
theTRON 18 अक्टूबर 2013, 05:29

नामस्थानों का उपयोग करके डेविस नियंत्रकों और विचारों को ओवरराइड करने का एक बेहतर और अधिक संगठित तरीका:

निम्नलिखित फ़ोल्डर बनाएँ:

app/controllers/my_devise
app/views/my_devise

उन सभी नियंत्रकों को रखें जिन्हें आप ऐप/नियंत्रकों/my_devise में ओवरराइड करना चाहते हैं और MyDevise नेमस्पेस को नियंत्रक वर्ग नामों में जोड़ें। Registrations उदाहरण:

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

  ...

  def create
    # add custom create logic here
  end

  ...    

end 

तदनुसार अपने मार्ग बदलें:

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

डेविस जेम फ़ोल्डर से सभी आवश्यक दृश्यों को app/views/my_devise में कॉपी करें या rails generate devise:views का उपयोग करें, उन दृश्यों को हटा दें जिन्हें आप ओवरराइड नहीं कर रहे हैं और devise फ़ोल्डर का नाम बदलकर my_devise कर दें।

इस तरह आपके पास दो फोल्डर में सब कुछ बड़े करीने से व्यवस्थित होगा।

66
Vincent 18 मार्च 2011, 21:38

मेरा मानना ​​​​है कि पंजीकरण नियंत्रक को फिर से लिखने से बेहतर समाधान है। मैंने ठीक वैसा ही किया (मेरे पास कंपनी के बजाय सिर्फ संगठन है)।

यदि आप अपने नेस्टेड फॉर्म को मॉडल और दृश्य स्तर पर ठीक से सेट करते हैं, तो सब कुछ एक आकर्षण की तरह काम करता है।

मेरा उपयोगकर्ता मॉडल:

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

मेरा संगठन मॉडल:

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

मेरा विचार : 'devise/registrations/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" %>
35
thb 24 पद 2010, 18:28

आप वसीयत अनुकूलन के लिए विचार और नियंत्रक उत्पन्न कर सकते हैं।

उपयोग

rails g devise:controllers users -c=registrations

तथा

rails g devise:views 

यह विशेष नियंत्रकों और विचारों को मणि से आपके आवेदन में कॉपी करेगा।

इसके बाद, राउटर को इस नियंत्रक का उपयोग करने के लिए कहें:

devise_for :users, :controllers => {:registrations => "users/registrations"}
14
user1201917 6 मार्च 2016, 16:36

बहुत ही सरल तरीके बस टर्मिनल पर जाएं और निम्नलिखित टाइप करें

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

कस्टम दृश्यों का उपयोग करने के लिए आगे

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

अब आपके रूट.आरबी फाइल में

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

आप अन्य नियंत्रक भी जोड़ सकते हैं। यह उपयोगकर्ता फ़ोल्डर में नियंत्रकों और उपयोगकर्ता फ़ोल्डर में विचारों का उपयोग करने के लिए तैयार करेगा।

अब आप अपने विचारों को अपनी इच्छा के अनुसार अनुकूलित कर सकते हैं और नियंत्रकों/उपयोगकर्ता फ़ोल्डर में नियंत्रकों को अपना तर्क जोड़ सकते हैं। आनंद लेना !

13
Pradeep Sapkota 22 जुलाई 2016, 04:48