Ghi đè bộ điều khiển đăng ký


236

Tôi đã thêm một trường vào biểu mẫu đăng ký dựa trên một mô hình khác, xem Làm cách nào để sử dụng các thuộc tính lồng nhau với mô hình phát minh cho các chi tiết chính. Phần này đang hoạt động tốt.

Vấn đề bây giờ là khi tôi lưu, nó bị lỗi trong hành động tạo của bộ điều khiển đăng ký được cung cấp bởi phát minh với một Activerecord::UnknownAttributeErrortrường này (công ty).

Tôi giả sử tôi cần ghi đè lên bộ điều khiển đăng ký, hoặc có cách nào tốt hơn / dễ dàng hơn để tôi tiếp cận điều này không?


1
Tôi thực sự đã viết cả một bài đăng trên blog về jacopretorius.net/2014/03/ trên
Jaco Pretorius

Câu trả lời:


354

Trong biểu mẫu của bạn, bạn có chuyển qua bất kỳ thuộc tính nào khác không, thông qua việc gán khối lượng không thuộc về mô hình người dùng của bạn hoặc bất kỳ mô hình lồng nhau nào?

Nếu vậy, tôi tin rằng ActiveRecord :: UnknownAttributionError được kích hoạt trong trường hợp này.

Mặt khác, tôi nghĩ rằng bạn chỉ có thể tạo bộ điều khiển của riêng mình, bằng cách tạo ra một cái gì đó như thế này:

# 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 

Và sau đó nói với devise để sử dụng bộ điều khiển đó thay vì mặc định với:

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

3
Nhưng làm thế nào để bạn chắc chắn nghĩ ra cái nhìn trong dir dev cho quan điểm? Tôi đang thử cách này nhưng nghĩ ra các phương thức như "sign_in_and_redirect (resource_name, resource)" đang tìm kiếm trong các khung nhìn cho mẫu.
AnApprentice

7
Nếu bạn muốn tùy chỉnh các chế độ xem khác nhau của mình, bạn chỉ cần tạo chúng trước và devise sẽ kiểm tra thư mục chế độ xem của bạn trước khi tải các chế độ xem từ đá quý. Trong Rails 3 đó là: rails generate devise:viewsvà trong Rails 2 (tôi nghĩ) đó là:script/generate devise:views
theTRON

2
bản hack ở trên không hoạt động với phiên bản 1.0.8, phiên bản hoạt động cho rails 2.
William Yeung

18
Nếu bạn ghi đè bộ điều khiển Devise như thế này, hãy đảm bảo bạn sao chép tất cả các chế độ xem từ ứng dụng / lượt xem / phát minh / đăng ký sang ứng dụng / lượt xem / đăng ký / (thay đổi cho bất kỳ trình điều khiển nào bạn ghi đè).
Jamie Cobbett

31
Ngoài ra, bạn có thể để lại quan điểm sai lệch của bạn ở nơi họ đang ở và thêm paths.app.views << "app/views/devise"vào config/application.rb.
theTRON

66

Một cách tốt hơn và có tổ chức hơn để ghi đè các bộ điều khiển và khung nhìn Devise bằng cách sử dụng các không gian tên:

Tạo các thư mục sau:

app/controllers/my_devise
app/views/my_devise

Đặt tất cả các bộ điều khiển mà bạn muốn ghi đè vào ứng dụng / bộ điều khiển / my_devise và thêm MyDevisekhông gian tên vào tên lớp của bộ điều khiển. Registrationsthí dụ:

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

  ...

  def create
    # add custom create logic here
  end

  ...    

end 

Thay đổi tuyến đường của bạn cho phù hợp:

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

Sao chép tất cả các chế độ xem được yêu cầu vào app/views/my_devisetừ thư mục Devise gem hoặc sử dụng rails generate devise:views, xóa các chế độ xem bạn không ghi đè và đổi tên devisethư mục thành my_devise.

Bằng cách này, bạn sẽ có mọi thứ được sắp xếp gọn gàng trong hai thư mục.


1
Cách này tương tự như cách tôi đang thực hiện, nhưng tôi không biết logic tùy chỉnh nào được đưa vào createphương pháp của Devise's tôi ghi đè. Bộ điều khiển do giàn giáo của tôi tạo ra mà tôi đã sửa đổi hoạt động rất tốt, nhưng làm thế nào để bạn làm cho nó hoạt động với resourcedoanh nghiệp của Devise ?
Kyle Carlson

@Vincent cảm ơn bạn - nếu tôi muốn ghi đè chỉ một phương thức, tôi có viết chỉ phương thức tôi muốn ghi đè không - và mọi thứ khác có hoạt động như bình thường không? Sự giúp đỡ của bạn được đánh giá cao
BKSpurgeon

MyDevise::RegistrationsController < Devise::RegistrationsControllertạo ra một lỗi phụ thuộc tròn. Tôi có làm điều gì sai?
ianrandmckenzie

34

Tôi tin rằng có một giải pháp tốt hơn là viết lại Trình đăng ký. Tôi đã làm chính xác điều tương tự (tôi chỉ có Tổ chức thay vì Công ty).

Nếu bạn đặt đúng hình thức lồng nhau của mình, ở cấp độ mô hình và chế độ xem, mọi thứ sẽ hoạt động như một nét quyến rũ.

Mô hình người dùng của tôi:

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

Mô hình tổ chức của tôi:

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

Quan điểm của tôi: 'nghĩ ra / đăng ký / 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
Di chuyển logic xây dựng từ chế độ xem sang mô hình sẽ sạch hơn, xem stackoverflow.com/questions/3544265#3764837
meleyal

Tôi đã tạo các bộ điều khiển phát minh và bây giờ có hành động tạo bộ điều khiển được kích hoạt khi người dùng nhấp Đăng ký. Có cách nào (như ghi đè / một số mã ví dụ) tôi có thể sử dụng Devise để mã hóa mật khẩu và kiểm tra phụ trợ của mật khẩu và các trường khác không? và lưu nó vào cơ sở dữ liệu mô hình?
HP

Làm thế nào bạn có thể truy cập biến cục bộ resourcetrong khung nhìn thay vì biến thể hiện của lớp @resource?
Chloe

11

Bạn có thể tạo các khung nhìn và bộ điều khiển để tùy chỉnh.

Sử dụng

rails g devise:controllers users -c=registrations

rails g devise:views 

Nó sẽ sao chép các bộ điều khiển và khung nhìn cụ thể từ đá quý vào ứng dụng của bạn.

Tiếp theo, báo cho bộ định tuyến sử dụng bộ điều khiển này:

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

11

Phương pháp rất đơn giản Chỉ cần đi đến thiết bị đầu cuối và loại sau đây

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

Tiếp theo để sử dụng chế độ xem tùy chỉnh

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

bây giờ trong tập tin route.rb của bạn

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

Bạn có thể thêm các bộ điều khiển khác quá. Điều này sẽ tạo ra để sử dụng bộ điều khiển trong thư mục người dùng và chế độ xem trong thư mục người dùng.

Bây giờ bạn có thể tùy chỉnh chế độ xem theo mong muốn của mình và thêm logic của bạn vào bộ điều khiển trong thư mục bộ điều khiển / người dùng. Thưởng thức !

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.