ruby-on-rails - tutorial - rails devise хабр




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

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

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

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

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

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


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

использование

rails g devise:controllers users -c=registrations

а также

rails g devise:views 

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

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

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

Очень простые методы Просто перейдите к терминалу и следующему типу

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

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

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


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




devise