Подтвердить что ты не робот

Используйте обе таблицы учетных записей и пользователей с помощью программы "Разработка"

Я работаю с Rails 3.1.0 и Devise 1.4.8 и новичок в обоих.

Я хочу разрешить нескольким пользователям учетную запись. Первый пользователь для регистрации создает учетную запись (возможно, для своей компании), тогда этот пользователь может добавить больше пользователей. Пользователь всегда связан с одной учетной записью.

У меня есть таблицы пользователей и учетных записей. Сокращенные модели:

class User < ActiveRecord::Base
  belongs_to :account
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable,
     :confirmable, :lockable, :timeoutable
  attr_accessible :email, :password, :password_confirmation, :remember_me
end

class Account < ActiveRecord::Base
  has_many :users, :dependent => :destroy
  attr_accessible :name, :account_type
end

Вопрос в том, когда первый пользователь регистрируется, как мне создать учетную запись и пользователя?

  • Нужно ли мне модифицировать/переопределять Registrations_controller, что-то вроде ответа здесь? Я не мог понять, как создайте учетную запись и передайте ее в "Разработка" для создания пользователя.

  • account_id уже находится в пользовательской модели. Должен ли я добавить account_name и account_type к модели пользователя, и создать новую учетную запись запись, если account_id не передается? В этом случае я пытаюсь скрыть создание аккаунта из Devise, но не уверен, что это сработает, так как мне все еще нужно запрашивать имя учетной записи и account_type на странице регистрации.

4b9b3361

Ответ 1

Наконец, это получило работу с использованием вложенных атрибутов. Как обсуждалось в комментариях к Kenton, этот пример отменяется. Если вам нужно несколько пользователей на одну учетную запись, сначала необходимо создать учетную запись, а затем Пользователь - даже если вы только создаете одного пользователя для начала. Затем вы пишете свой собственный контроллер учетных записей и просматриваете, минуя представление "Разработать". Функциональность Devise для отправки писем с подтверждением и т.д. По-прежнему работает, если вы просто создаете пользователя напрямую, т.е. Эта функциональность должна быть частью автомата в модели Devise; он не требует использования контроллера Devise.

Выдержки из соответствующих файлов:

Модели в приложении/моделях

class Account < ActiveRecord::Base
  has_many :users, :inverse_of => :account, :dependent => :destroy
  accepts_nested_attributes_for :users
  attr_accessible :name, :users_attributes
end

class User < ActiveRecord::Base
  belongs_to :account, :inverse_of => :users
  validates :account, :presence => true
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable, :lockable, :timeoutable
  attr_accessible :email, :password, :password_confirmation, :remember_me
end

spec/models/account_spec.rb Тест модели RSpec

it "should create account AND user through accepts_nested_attributes_for" do
  @AccountWithUser = { :name => "Test Account with User", 
                       :users_attributes => [ { :email => "[email protected]", 
                                                :password => "testpass", 
                                                :password_confirmation => "testpass" } ] }
  au = Account.create!(@AccountWithUser)
  au.id.should_not be_nil
  au.users[0].id.should_not be_nil
  au.users[0].account.should == au
  au.users[0].account_id.should == au.id
end

конфигурации /routes.rb

  resources :accounts, :only => [:index, :new, :create, :destroy]

Контроллеры /accounts _controller.rb

class AccountsController < ApplicationController

  def new
    @account = Account.new
    @account.users.build # build a blank user or the child form won't display
  end

  def create
    @account = Account.new(params[:account])
    if @account.save
      flash[:success] = "Account created"
      redirect_to accounts_path
    else
      render 'new'
    end
  end

end

views/accounts/new.html.erb просмотр

<h2>Create Account</h2>

<%= form_for(@account) do |f| %>
  <%= render 'shared/error_messages', :object => f.object %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>

  <%= f.fields_for :users do |user_form| %>
    <div class="field"><%= user_form.label :email %><br />
    <%= user_form.email_field :email %></div>
    <div class="field"><%= user_form.label :password %><br />
    <%= user_form.password_field :password %></div>
    <div class="field"><%= user_form.label :password_confirmation %><br />
    <%= user_form.password_field :password_confirmation %></div>
  <% end %>

  <div class="actions">
    <%= f.submit "Create account" %>
  </div>
<% end %>

Рельсы довольно разборчивы по поводу множественного числа и единственного числа. Поскольку мы говорим, что Account has_many Users:

  • он ожидает, что user_attributes (а не user_attributes) в модели и тестах
  • он ожидает массив хэшей для теста, даже если в массиве есть только один элемент, поэтому [] вокруг {user attributes}.
  • он ожидает @account.users.build в контроллере. Мне не удалось заставить синтаксис f.object.build_users работать непосредственно в представлении.

Ответ 2

Не могли бы вы использовать что-то вроде того, что было в этих RailsCasts?:

http://railscasts.com/episodes/196-nested-model-form-part-1

http://railscasts.com/episodes/197-nested-model-form-part-2

Вы можете настроить свои модели, как описано в этих сценариях, используя accepts_nested_attributes_for.

Затем ваша форма представлений /devise/registrations/new.html.erb будет для: user like normal и может включать вложенную форму для: account.

Так что-то вроде этого в этой форме по умолчанию:

<%= f.fields_for :account do |account_form| %>
<div>
  <p>
    <%= account_form.label :name, "Account Name", :class => "label" %>
    <%= account_form.text_field :name, :class => "text_field" %>
    <span class="description">(e.g., enter your account name here)</span>
  </p>
</div>

<div>
  <p>
    <%= account_form.label :company, "Company Name", :class => "label" %>
    <%= account_form.text_field :company, :class => "text_field" %>
  </p>
</div>
<% end %>

Это пример кода из приложения, над которым я работаю, и я использую жемчужину simple_form, поэтому помощники, используемые в вашем приложении, могут быть разными, но вы, вероятно, получите эту идею.

Поэтому, когда пользователь создается (когда они регистрируются), они также могут заполнять информацию, которая будет использоваться моделью учетной записи, чтобы создать свою учетную запись после нажатия кнопки "Зарегистрироваться".

И вы можете установить атрибут для этого пользователя, например, "admin"... похоже, что этот первоначальный пользователь будет пользователем "admin" для компании, хотя другие пользователи также могут иметь доступ.

Надеюсь, что это поможет.