Переопределить устройство регистрации регистраций - PullRequest
230 голосов
/ 23 августа 2010

Я добавил поле в форму регистрации, основанное на другой модели, см. Как использовать вложенные атрибуты с моделью устройства для подробных сведений. Эта часть работает нормально.

Проблема теперь в том, что когда я сохраняю, происходит сбой в действии create контроллера регистрации, который предоставляется devise с Activerecord::UnknownAttributeError в этом поле (компания).

Я предполагаю, что мне нужно переопределить контроллер регистраций, или есть лучший / более простой способ приблизиться к этому?

Ответы [ 6 ]

350 голосов
/ 24 августа 2010

В вашей форме вы передаете какие-либо другие атрибуты, через массовое присвоение, которые не принадлежат вашей пользовательской модели, или любой из вложенных моделей?

Если это так, я считаю 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 

И затем сказать devise использовать этот контроллер вместопо умолчанию:

# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}
66 голосов
/ 18 марта 2011

Лучший и более организованный способ переопределения контроллеров и представлений Devise с использованием пространств имен:

Создайте следующие папки:

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 из папки Devise gem или используйте rails generate devise:views, удалите просмотры, которые выне переопределяйте и переименуйте папку devise в my_devise.

Таким образом, вы аккуратно организуете все в две папки.

33 голосов
/ 24 декабря 2010

Я считаю, что есть лучшее решение, чем переписать 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" %>
11 голосов
/ 06 марта 2016

Вы можете создавать представления и контроллеры для настройки устройства.

Использовать

rails g devise:controllers users -c=registrations

и

rails g devise:views 

Он скопирует определенные контроллеры и представления из gem в вашapplication.

Далее скажите маршрутизатору использовать этот контроллер:

devise_for :users, :controllers => {:registrations => "users/registrations"}
10 голосов
/ 22 июля 2016

Очень простые методы. Просто зайдите в терминал и наберите

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

Вы также можете добавить другие контроллеры.Это позволит использовать контроллеры в папке users и представления в папке users.

Теперь вы можете настроить свои представления по своему желанию и добавить свою логику для контроллеров в папке controllers / users.Наслаждайтесь!

0 голосов
/ 21 декабря 2015

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