ওভাররাইড ডিভাইস নিবন্ধকরণ নিয়ামককে ওভাররাইড করুন


236

আমি সাইন-আপ ফর্মটিতে একটি ক্ষেত্র যুক্ত করেছি যা ভিন্ন মডেলের উপর ভিত্তি করে তৈরি হয়েছে, দেখুন কীভাবে ঘৃণ্য বিবরণের জন্য আমি নকশা করা মডেলটির সাথে নেস্টেড বৈশিষ্ট্যগুলি ব্যবহার করব । এই অংশটি ভাল কাজ করছে।

সমস্যাটি এখন যখন আমি সংরক্ষণ করি, এটি রেজিস্ট্রেশন কন্ট্রোলারের তৈরি করার ক্রিয়ায় ব্যর্থ হয় যা Activerecord::UnknownAttributeErrorএই ক্ষেত্রটি (সংস্থার) সাথে পরিকল্পনা করে সরবরাহ করা হয় ।

আমি ধরে নিচ্ছি যে নিবন্ধগুলি নিয়ন্ত্রণকারীকে আমার ওভাররাইড করতে হবে, বা আমার কাছে যাওয়ার আরও ভাল / সহজ উপায় কি আছে?


উত্তর:


354

আপনার ফর্মটিতে আপনি কি এমন কোনও ভরসা যা আপনার ব্যবহারকারীর মডেল বা নেস্টেড মডেলগুলির কোনও নয়?

যদি তা হয়, তবে আমি বিশ্বাস করি যে অ্যাক্টিভেকর্ড :: অজানাঅ্যাট্রিবিউট এরিয়ারটি এই উদাহরণস্বরূপ ট্রিগার হয়েছে।

অন্যথায়, আমি মনে করি আপনি নিজের কন্ট্রোলার তৈরি করতে পারেন, এরকম কিছু তৈরি করে:

# 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"}

3
তবে আপনি কীভাবে নিশ্চিত হন যে দর্শনগুলির জন্য বুদ্ধিমানের ডিয়ারটি সঠিকভাবে দেখায়? আমি এটি চেষ্টা করছি তবে "সাইন_ইন_আর_ড্রেইক্ট্রেট (রিসোর্স_নেস, রিসোর্স)" এর মতো পদ্ধতিগুলি টেমপ্লেটের জন্য দর্শন খুঁজছেন।
অ্যানপ্রেন্টিস

7
আপনি যদি নিজের ভ্রান্ত মতামতগুলি কাস্টমাইজ করতে চান তবে আপনাকে প্রথমে এগুলি তৈরি করতে হবে এবং রত্ন থেকে দর্শনগুলি লোড করার আগে আপনার দৃষ্টিভঙ্গি ফোল্ডারটি পরীক্ষা করবে will পাগল 3 এটা আছে: rails generate devise:viewsএবং পাগল 2 (আমি মনে করি) এটা হল:script/generate devise:views
theTRON

2
উপরের হ্যাকটি 1.0.8 এর সাথে কাজ করে না যা সংস্করণটি রেল 2 এর জন্য কাজ করে
উইলিয়াম ইয়ুং

18
আপনি যদি কোনও ডিভাইস নিয়ামককে এইরূপে ওভাররাইড করেন তবে নিশ্চিত হয়ে নিন যে আপনি অ্যাপ্লিকেশন / দর্শনগুলি / নকশাগুলি / রেজিস্ট্রেশনগুলি থেকে অ্যাপ / ভিউ / রেজিস্ট্রেশন / (আপনি যে কোনও নিয়ামককে ওভাররেড করছেন তার পরিবর্তনের জন্য) থেকে সমস্ত দর্শন অনুলিপি করেছেন।
জ্যামি কোবিট

31
বিকল্পভাবে আপনি আপনার কল্পিত দর্শনগুলি যেখানে থাকতে পারেন তা ছেড়ে যেতে পারেন paths.app.views << "app/views/devise"এবং এতে আপনার যুক্ত করতে পারেন config/application.rb
theTRON

66

নেমস্পেসগুলি ব্যবহার করে ডিভাইস কন্ট্রোলার এবং ভিউগুলি ওভাররাইড করার একটি আরও ভাল এবং আরও সুসংহত পদ্ধতি:

নিম্নলিখিত ফোল্ডারগুলি তৈরি করুন:

app/controllers/my_devise
app/views/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

এইভাবে আপনার কাছে দুটি ফোল্ডারে খুব সুন্দরভাবে সাজানো থাকবে।


1
এটি আমি গ্রহণ করা পদ্ধতির অনুরূপ, তবে createডিভাইসের আই ওভাররোটের পদ্ধতিতে কোন কাস্টম যুক্তি রাখতে হবে তা আমি জানি না । আমার স্ক্যাফোल्ड-তৈরি কন্ট্রোলার যা আমি সংশোধিত করেছি দুর্দান্ত কাজ করে তবে আপনি কীভাবে এটি ডিভাইসের resourceব্যবসায়ের সাথে কাজ করবেন ?
কাইল কার্লসন

@ ভিনসেন্ট আপনাকে ধন্যবাদ - আমি যদি কেবল একটি পদ্ধতি ওভাররাইড করতে চাই, তবে আমি কি সেই পদ্ধতিটিই লিখতে চাই যা আমি ওভাররাইড করতে চাই - এবং অন্য কি সবকিছু ঠিক স্বাভাবিক হিসাবে কাজ করবে? আপনার সহায়তার প্রশংসা
বিকেএসপুরজিয়ান

MyDevise::RegistrationsController < Devise::RegistrationsControllerএকটি বিজ্ঞপ্তি নির্ভরতা ত্রুটি তৈরি করে। আমি কি ভুল কিছু করছি?
ianrandmckenzie

34

আমি বিশ্বাস করি যে রেজিস্ট্রেশনস কনট্রোলার পুনরায় লেখার চেয়ে আরও ভাল সমাধান আছে। আমি ঠিক একই জিনিসটি করেছি (কোম্পানির পরিবর্তে আমার কেবল সংস্থা আছে)।

আপনি যদি আপনার নেস্টেড ফর্মটি ঠিকঠাকভাবে সেট করেন, মডেল এবং দেখুন স্তরে, সবকিছু মনোহর মতো কাজ করে।

আমার ব্যবহারকারী মডেল:

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

আমার দর্শন: 'পরিকল্পনা / নিবন্ধন / 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
মডেলের ভিউ থেকে বিল্ড যুক্তিবিজ্ঞান মুভিং ক্লিনার হবে, দেখতে stackoverflow.com/questions/3544265#3764837
meleyal

আমি নকশাকার কন্ট্রোলার তৈরি করেছি এবং এখন ব্যবহারকারী ক্লিক সাইন আপ করার সাথে সাথে কন্ট্রোলার অ্যাকশন তৈরি শুরু করে। পাসওয়ার্ড এনক্রিপ্ট করার জন্য এবং পাসওয়ার্ড এবং অন্যান্য ক্ষেত্রগুলির ব্যাকএন্ড চেক করতে আমি ডিভাইস ব্যবহার করতে পারি? এবং এটি মডেল ডাটাবেসে সংরক্ষণ করছেন?
এইচপি

resourceশ্রেণীর উদাহরণের পরিবর্তনের পরিবর্তে আপনি কীভাবে স্থানীয় ভেরিয়েবলটি অ্যাক্সেস করতে সক্ষম হন @resource?
ক্লো

12

আপনি কাস্টমাইজেশন তৈরির জন্য দর্শন এবং নিয়ামক তৈরি করতে পারেন।

ব্যবহার

rails g devise:controllers users -c=registrations

এবং

rails g devise:views 

এটি মেশিন থেকে আপনার অ্যাপ্লিকেশনে নির্দিষ্ট নিয়ন্ত্রক এবং দর্শনগুলি অনুলিপি করবে।

এরপরে, এই নিয়ামকটি ব্যবহার করতে রাউটারকে বলুন:

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

11

খুব সহজ পদ্ধতি কেবল টার্মিনাল এবং নিম্নলিখিত ধরণে যান

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" }

আপনি অন্যান্য নিয়ামকগুলিকেও যুক্ত করতে পারেন। এটি ব্যবহারকারীর ফোল্ডারে কন্ট্রোলার এবং ব্যবহারকারী ফোল্ডারে দর্শনগুলি তৈরি করতে সক্ষম হবে views

এখন আপনি নিজের মতামতগুলি আপনার ইচ্ছা হিসাবে কাস্টমাইজ করতে পারেন এবং আপনার যুক্তিটিকে নিয়ন্ত্রণকারী / ব্যবহারকারী ফোল্ডারে নিয়ন্ত্রণকারীদের সাথে যুক্ত করতে পারেন। উপভোগ করুন!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.