2015-09-16 2 views
0

Предположим у меня есть модель пользователяRails Завещание - Как добавить данные current_user

user.rb

class User < ActiveRecord::Base 
    ... 
end 

с атрибутами, такими как: имя, имя пользователя, доступ

доступа перечисление, которое сообщает мне, является ли пользователь «персоналом» или «заказчиком»

Чтобы получить имя и имя пользователя вошедшего в систему пользователя, я могу сделать:

current_user.name 
current_user.username 

И предположим, у меня есть модель сотрудников

staff.rb

class Staff < ActiveRecord::Base 
    belongs_to :user 
end 

с атрибутами, такими как: заработная плата, phone_number

И у меня также есть модель клиента

cus tomer.rb

class Customer < ActiveRecord::Base 
    belongs_to :user 
end 

с атрибутами, такими как: адрес, phone_number


Я хочу, чтобы быть в состоянии назвать это на контроллер моего персонала:

current_user.staff.salary 

И это на мой клиента контроллер:

current_user.customer.address 

ЧТО Я ПРОБОВАЛИ ПОКА

Я переписал sessions_controller.rb

def create 
    super 
    model_name = current_user.access.capitalize.constantize 
    spec = model_name.where(user_id: current_user.id).take 
    session[:spec] = spec 
end 

Так я могу получить к нему доступ с помощью сессии [: спецификации], но не через CURRENT_USER. Есть идеи?

ответ

1

Ну начнем с того, ваша модель Пользователь должен ссылаться на персонал или клиента, даже если они будут оставаться пустыми

class User 

    has_one :staff 
    has_one :address 

Просто, делая это, вы должны быть в состоянии использовать current_user.customer.address. Однако...

Я предлагаю вам добавить некоторые удобные методы в ApplicationController или модуль, который включает в себя

def staff_signed_in? 
    @staff_signed_in ||= (user_signed_in? and current_user.access == :staff) 
end 

def current_staff 
    @current_staff ||= (current_user.staff if staff_logged_in?) 
end 

# same for customer 
# Note that I use instance variables so any database queries are executed only once ! 

Тогда вы можете просто позвонить

<% if customer_signed_in? %> 
    <h2>Logged in as customer</h2> 
    <p>Address : <%= current_customer.address %> 
<% end %> 

EDIT: о ваших проблемах, касающихся базы данных хитов

Вы привели пример current_user.customer.cart.products

Это действительно довольно вложенная ассоциация. Мое предложение выше уже уменьшает его на один уровень (т.е. current_customer == current_user.customer). Тогда вам нужно пройти через телеги, чтобы добраться до продуктов ... это не так плохо, на мой взгляд. Если вам нужно часто называть это (current_customercustomer.cart), вы можете переопределить current_customer для данного контроллера и загрузить загруженные вами ресурсы, которые вы будете использовать.

def UserShopController < ApplicationController 
# Let's assume current_customer is defined in ApplicationController like I showed above 
# UserShopController always uses the customer cart, so let's load it right at the beginning 
... 

private 
    # Override with eager loading 
    def current_customer 
     @current_customer ||= (current_user.customer.includes(:cart) if customer_logged_in?) 
    end 
+0

Вы показали мне, как я могу получить доступ к current_customer.address. Я еще не пробовал. Есть ли способ доступа, например current_user.customer.address? – Aleksandrus

+1

До тех пор, пока вы добавляете операторы 'has_one',' current_user.customer.address' также должен работать –

+0

Это сработало! Спасибо! Мне интересно, почему вы сделали это предложение. Может быть, вы говорите о случае, когда мнения разделяются? – Aleksandrus

1

добавить has_one :customer к вашему user.rb

Вашей модели пользователя должен быть как ниже, чтобы доступ к соответствующей модели.

class User < ActiveRecord::Base 
    has_one :customer 
end 
Смежные вопросы