Контроллер регистрации переопределения

Я добавил поле в форму регистрации, основанную на другой модели, см. Как использовать вложенные атрибуты с моделью разработки для 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"}