Контроллер регистрации переопределения
Я добавил поле в форму регистрации, основанную на другой модели, см. Как использовать вложенные атрибуты с моделью разработки для gory Детали. Эта часть работает нормально.
Проблема заключается в том, что когда я сохраняю, он не работает в создании действия контроллера регистрации, который поставляется с помощью Activerecord::UnknownAttributeError
в этом поле (компания).
Я предполагаю, что мне нужно переопределить контроллер регистрации, или есть лучший/более простой способ, которым я должен приближаться к этому?
Ответы
Ответ 1
В вашей форме вы передаете какие-либо другие атрибуты, используя массовое присвоение, не принадлежащее вашей модели пользователя, или любую из вложенных моделей?
Если это так, я считаю, что 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"}
Ответ 2
Лучший и более организованный способ переопределения контроллеров и представлений с помощью пространств имен:
Создайте следующие папки:
app/controllers/my_devise
app/views/my_devise
Поместите все контроллеры, которые вы хотите переопределить в app/controllers/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
из папки Devise gem или используйте rails generate devise:views
, удалите просмотры, которые вы не переопределяете, и переименуйте devise
в папку my_devise
.
Таким образом, у вас будет все, что аккуратно организовано в две папки.
Ответ 3
Я считаю, что есть лучшее решение, чем переписать RegistrationsController. Я сделал то же самое (у меня просто Организация, а не Компания).
Если вы правильно установили свою вложенную форму, на модели и уровне просмотра, все работает как шарм.
Моя модель пользователя:
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" %>
Ответ 4
Вы можете создавать представления и контроллеры для разработки настроек.
Использование
rails g devise:controllers users -c=registrations
и
rails g devise:views
Он скопирует определенные контроллеры и представления из gem в ваше приложение.
Затем скажите маршрутизатору использовать этот контроллер:
devise_for :users, :controllers => {:registrations => "users/registrations"}
Ответ 5
Очень простые методы
Просто зайдите на терминал и введите следующий
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
теперь в файле route.rb
devise_for :users, controllers: {
:sessions => "users/sessions",
:registrations => "users/registrations" }
Вы можете добавить и другие контроллеры. Это позволит использовать контроллеры в папке пользователя и представлениях в папке пользователя.
Теперь вы можете настроить свои представления как свое желание и добавить свою логику к контроллерам в папке контроллеров/пользователей.
Наслаждайтесь!
Ответ 6
Вы также можете сделать папку devise
на вашем пути к контроллерам и скопировать/вставить в нее весь коннектор. Это не требует дополнительной настройки.
Итак, для контроллера регистрации это будет app/controllers/devise/registrations_controller.rb
, а затем скопируйте в него исходный код registrations_controller.rb
. Вы можете получить его из github https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb, или вы можете отслеживать его в источнике драгоценных камней, или если вы используете RubyMine при вводе class line class Devise::RegistrationsController
слева появляется глобусный символ... щелкните по нему, и он откроет для вас файл контроллера регистрации. Затем скопируйте/вставьте.
Ответ 7
создать регистрацию контроллера и переопределить свой унаследованный класс предопределенным классом Devise:: RegistrationsController
# 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"}