0

Je suis nouveau sur ruby ​​on rails et je suis un peu coincé avec ce que la meilleure étape suivante est dans une application multi-location que je construis.Ruby on Rails - Ressources de portée par current_account

Fondamentalement, je veux étendre les ressources par account_id, j'ai donc créé une méthode et un assistant appelé current_account dans mes comptes base_controller.

Cependant, le didacticiel que je suis suit les portées current_account par sous-domaine, ce que je ne veux pas faire. J'ai donc besoin d'un moyen d'identifier le compte_id de l'utilisateur actuel afin que je puisse avoir une variable de ressource @contact = current_account.contacts. "All". Dois-je créer une nouvelle association entre l'utilisateur et le modèle de compte afin que je puisse utiliser l'assistant current_user pour définir l'ID du compte actuel ou existe-t-il un meilleur moyen? Si oui, quelle est la meilleure façon de le faire?

Arrière-plan Le premier utilisateur qui s'inscrit devient le propriétaire du compte. Les titulaires de compte peuvent ensuite inviter d'autres utilisateurs au compte. J'utilise le gemme de concevoir. Les ressources sont définies par compte afin que seuls les utilisateurs liés à un compte puissent voir les enregistrements appartenant à ce compte.

contrôleur de base

module Accounts 
    class BaseController < ApplicationController 
    def current_account 
     @current_account ||= ????? 
    end 
    helper_method :current_account 

    def owner? 
     current_account.owner == current_user 
    end 
    helper_method :owner? 
    end 
end 

Contacts (ma ressource) Contrôleur

module Accounts 
    class ContactsController < Accounts::BaseController 
    def index 
     @contact = current_account.contacts.all 
    end 
    end 
end 

Compte Modèle

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

    validates :subdomain, presence: true, uniqueness: true 

    has_many :contacts 
    has_many :invitations 
    has_many :memberships 
    has_many :users, through: :memberships 
end 

Invitation Modèle

class Invitation < ActiveRecord::Base 
    belongs_to :account 
    validates :email, presence: true 
end 

Modèle d'adhésion

class Membership < ActiveRecord::Base 
    belongs_to :account 
    belongs_to :user 
end 

Modèle utilisateur

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

Routes

Rails.application.routes.draw do 
    devise_for :users 
    scope module: "accounts" do 
    resources 'dashboard' 
    resources 'contacts' 
    resources :invitations, only: [:new, :create] do 
    member do 
     get :accept 
     patch :accepted 
    end 
    end 
    resources :users, only: [:index, :destroy] 
end 

Schéma

ActiveRecord::Schema.define(version: 20170124002015) do 

    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 "contacts", force: true do |t| 
    t.string "first_name" 
    t.string "last_name" 
    t.string "phone" 
    t.string "email" 
    t.text  "comments" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "account_id" 
    end 

    add_index "contacts", ["account_id"], name: "index_contacts_on_account_id" 

    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 "memberships", force: true do |t| 
    t.integer "account_id" 
    t.integer "user_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    add_index "memberships", ["account_id"], name: "index_memberships_on_account_id" 
    add_index "memberships", ["user_id"], name: "index_memberships_on_user_id" 

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

    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 

end 
+0

Avez-vous regardé ce bijou? https://github.com/elabs/pundit il vous permet de créer des stratégies pour vos utilisateurs. Je suis assez sûr que vous pouvez le prendre à partir de là. – saadlulu

+0

Merci. On dirait que ça va marcher pour moi. Je vais le tester maintenant. –

Répondre

0

Il existe deux associations possibles entre les utilisateurs et les comptes:

  1. utilisateurs ont de nombreux comptes
  2. utilisateurs appartiennent à un compte

Dans le premier cas, le locataire ne peut pas être défini à partir de current_user, car il n'est pas clair quel compte doit être utilisé en tant que locataire actuel. La table d'appartenance dans le schéma.rb indique que c'est l'approche adoptée par le tutoriel que vous avez mentionné.Le chargement du compte par sous-domaine permet de spécifier quel compte doit être utilisé en tant que locataire actuel.

Dans le second cas, chaque utilisateur a un seul compte. Les utilisateurs obtiennent un account_id, la table d'adhésion devient obsolète, et vous pouvez charger le locataire actuel comme ceci:

def current_account 
    @current_account ||= current_user.account 
end 

Ai-je besoin de faire une nouvelle association entre le modèle d'utilisateur et compte afin que je puisse utiliser l'assistant current_user pour définir l'ID de compte actuel ou existe-t-il un meilleur moyen? Si oui, quelle est la meilleure façon de faire cela?

Il me semble que vous voulez prendre la deuxième approche, qui exige qu'un compte has_many utilisateurs et un utilisateur belongs_to un compte.

+0

Quelle est la meilleure façon de créer une association au sein du contrôleur de comptes pour que le compte_enregistré soit enregistré pour chaque nouvel utilisateur? Parce qu'il doit également conserver l'association propriétaire afin que le propriétaire du compte dispose d'un niveau d'accès plus élevé et créer plus d'utilisateurs à l'avenir. –