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
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
Merci. On dirait que ça va marcher pour moi. Je vais le tester maintenant. –