0

基本的には、Account(account_id)でリソースのスコープを設定したいので、アカウントaccount_controllerにcurrent_accountというメソッドとヘルパーを作成しました。Ruby on Rails - マルチテナントアカウントとユーザのアクティブレコードの関連

私は当初、一意の識別子としてサブドメインを使用していましたが、今はサブドメインを使用して削除し、アカウント所有者ユーザーを含むすべてのユーザーにaccount_idで関連付けさせたいと考えています。

問題は私のアカウントコントローラを作成してaccount_idを所有者のユーザに帰属させるための適切な方法を私のAccounts Controllerで見つけることができないことです。私はそれが私がすでに所有者を同時に構築している方法と関係があるかもしれないと思う。アカウント所有者は、新しいユーザーをアカウントに追加/招待する権利があるため、重要です。

誰でも手助けできますか?

背景

  • サインアップ最初のユーザーは、アカウントの所有者になります。
  • アカウント所有者は、アカウントに他のユーザーを招待できます。
  • 私はdevise gemを使用しています。リソースはアカウントごとにスコープされ、アカウントにリンクされているユーザーだけがそのアカウントに属するレコードを参照できるようになります。

アカウントモデル

class Account < ActiveRecord::Base 
    belongs_to :owner, class_name: "User" 
    accepts_nested_attributes_for :owner 

    validates :subdomain, presence: true, uniqueness: true 

    has_many :users  
    has_many :contacts 
    has_many :invitations 
end 

ユーザーモデル

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 
    belongs_to :account 
end 

アカウント・コントローラ

def new 
    @account = Account.new 
    @account.build_owner 
end 
def create 
    @user = current_user 
    @account = @user.account.build_user(account_params) 
    if @account.save 
     sign_in(@account.owner) 
     flash[:notice] = "Your account has been created." 
     redirect_to dashboard_index_path(current_user) 
     # redirect_to root_url(subdomain: @account.subdomain) 
    else 
     flash.now[:alert] = "Sorry, your account could not be created." 
     render :new 
    end 
end 

スキーマ

create_table "accounts", force: true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "owner_id" 
    t.string "subdomain" 
end 

add_index "accounts", ["subdomain"], name: "index_accounts_on_subdomain" 

create_table "invitations", force: true do |t| 
    t.string "email" 
    t.integer "account_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "token" 
end 

add_index "invitations", ["account_id"], name: "index_invitations_on_account_id" 
add_index "invitations", ["token"], name: "index_invitations_on_token" 

create_table "users", force: true do |t| 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0, null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "account_id" 
end 

add_index "users", ["account_id"], name: "index_users_on_account_id" 
add_index "users", ["email"], name: "index_users_on_email", unique: true 
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 

答えて

0

私は同様のアプリを持っています。組織を代理するアカウント。ここに私のモデル/コントローラです...

organization.rb

class Organization < ApplicationRecord 
    has_many :users 
    has_many :tasks, through: :users 
end 

user.rb

class User < ApplicationRecord 
    belongs_to :organization 
    has_many :tasks, dependent: :destroy 
    accepts_nested_attributes_for :organization 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    def self.get_users(current_org) 
    current_org.users 
    end 
end 

のではなく、あなたがしているように見えるように、コントローラに(アカウント)の組織を作成しますユーザーがサインアップするときにこれをやります。新しいユーザーがサインアップすると、組織名が入力されます。ビュー/工夫/登録/新しいビュー

<h2>Sign up</h2> 
<% resource.organization ||= Organization.new %> 
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> 
    <%= devise_error_messages! %> 

    <div class="field"> 
    <%= f.label :email %><br /> 
    <%= f.email_field :email, autofocus: true %> 
    </div> 

    <div class="field"> 
    <%= f.label :password %> 
    <% if @minimum_password_length %> 
    <em>(<%= @minimum_password_length %> characters minimum)</em> 
    <% end %><br /> 
    <%= f.password_field :password, autocomplete: "off" %> 
    </div> 

    <div class="field"> 
    <%= f.label :password_confirmation %><br /> 
    <%= f.password_field :password_confirmation, autocomplete: "off" %> 
    </div> 

    <%= f.fields_for :organization do |org| %> 
    <div><%= 'Organization or Company Name' %><br /> 
    <%= org.text_field :name %></div> 
    <% end %> 

    <div class="actions"> 
    <%= f.submit "Sign up" %> 
    </div> 
<% end %> 

<%= render "devise/shared/links" %> 

組織の管理者ユーザとして設定されているサインアップすると、組織内の他のユーザを作成できますユーザーのダッシュボードへのアクセス権を持っている。この最初のユーザーは、 。

ここでは、アプリケーションの実例とreadmeを示します。ルートフォルダにPDF:

https://github.com/marklocklear/devise_multitenant_rails5

は、この情報がお役に立てば幸い!

関連する問題