0

Я новичок в рубинах на рельсах, и я немного застрял в том, что лучший следующий шаг в многоуровневом приложении, которое я создаю.Ruby on Rails - Показывать ресурсы по current_account

В основном я хочу обладать ресурсами по account_id, поэтому я создал метод и помощник, называемый current_account, в моем аккаунте base_controller.

Однако в учебном пособии я следую областям current_account по субдомену, который я не хочу делать. Поэтому мне нужно определить идентификатор account_id текущего пользователя, чтобы у меня могла быть переменная ресурса @contact = current_account.contacts. "All".

Нужно ли создать новую связь между моделью пользователя и учетной записи, чтобы я мог использовать помощник current_user для определения текущего идентификатора учетной записи или есть лучший способ? Если да, то каков наилучший способ сделать это?

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

Базовый контроллер

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 

Контакты (мой ресурс) Контроллер

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

Модель счета

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 

Приглашение Модель

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

Членство Модель

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

пользователя Модель

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

Маршруты

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 

Схема

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

Вы взглянули на этот драгоценный камень? https://github.com/elabs/pundit позволяет создавать политики для ваших пользователей. Я уверен, что вы можете взять его оттуда. – saadlulu

+0

Спасибо. Похоже, это сработает для меня. Я собираюсь проверить это сейчас. –

ответ

0

Есть два возможных ассоциаций между пользователями и счета:

  1. пользователи имеют много счетов
  2. пользователи принадлежат к счету

В первом случае арендатор не может быть установлен из current_user, поскольку неясно, какую учетную запись следует использовать в качестве текущего арендатора. Таблица членства в schema.rb указывает, что это подход, использованный в упомянутом вами учебнике.Загрузка учетной записи по субдомену позволяет указать, какая учетная запись будет использоваться в качестве текущего арендатора.

Во втором случае каждый пользователь имеет только одну учетную запись. Пользователи получают account_id, таблица членства устаревает, и вы можете загрузить текущий арендатор так:

def current_account 
    @current_account ||= current_user.account 
end 

мне нужно, чтобы сделать новую связь между пользователем и учетной записью моделью , так что я могу использовать делать помощник current_user для определения текущего идентификатора учетной записи или есть лучший способ? Если да, то что это лучший способ сделать ?

Мне кажется, что вы хотите, чтобы принять второй подход, который требует, чтобы на счет has_many пользователей и пользователь belongs_to счет.

+0

Каков наилучший способ создания ассоциации в контроллере учетных записей, чтобы account_id сохранялся для каждого нового пользователя? Поскольку ему также необходимо поддерживать ассоциацию владельца, чтобы владелец учетной записи имел более высокий уровень доступа и создавал больше пользователей в будущем. –

Смежные вопросы