2015-01-28 5 views
2

У меня есть подписанный пользовательский профиль, и у каждого профиля есть своя телефонная книга , к которой у пользователя нет доступа. Вопрос в том, как я должен его реализовать. Учитывая Пользователь как один контроллер и телефонная книга как еще я не могу установить связь между ними для конкретного входа пользователя.Связь двух контроллеров в Rails

Какой должен быть мой подход?

У меня есть sparate модели для пользователя и отдельной модели для телефонной книги и установил связь между ними с помощью has_many и belongs_to макросъемки.

+0

Так в основном вы успешно установлено имеет много отношений между пользователем и phone_book правильно? Вам просто нужно указать эту информацию о телефонной книге на странице профиля пользователя (технически профиль users_controllers/показать действие). это ? – Ajay

+0

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

+0

Да Понял теперь. Пожалуйста, проверьте ниже ответ. Помещение ресурса телефонной книги внутри пользователей будет делать трюк :) – Ajay

ответ

1

Начнем с моделей. Вы говорите, что каждый имеет Userтолько одинPhoneBook, так что я хотел бы сказать, что правые модели должны быть достаточно:

class User < ActiveRecord::Base 
    has_one :phone_book 
end 

class PhoneBook < ActiveRecord::Base 
    belongs_to :user 
end 

Теперь о контроллерах. Когда у вас есть подписанный номер User, вы, в конце концов, будете иметь «сеансовую вещь». Предположим, вы используете devise, тогда у вас будет переменная current_user, которая ссылается на зарегистрированного пользователя. Таким образом, PhoneBooksController будет что-то вроде:

class PhoneBooksController < ApplicationController  
    def index 
    @phone_book = current_user.phone_book 
    end 
end 

Конечно, если ваши пользователи могут иметь более чем один PhoneBook мы вернемся к has_many ассоциации:

class User < ActiveRecord::Base 
    has_many :phone_book 
end 

class PhoneBook < ActiveRecord::Base 
    belongs_to :user 
end 

и контроллер становится:

class PhoneBooksController < ApplicationController  
    def index 
    @phone_books = current_user.phone_books 
    end 
    def show 
    @phone_book = PhoneBook.find_by_id(params[:id]) 
    end 
end 

Наконец, если вы хотите, чтобы эти телефонные книги были общедоступными, я предлагаю вам придерживаться вида UR REST Я

/phone_books/:id <-- good 
/users/:id/phone_books/:phone_book_id <-- too complex 

Надежда Я мог бы помочь

+0

Спасибо, что поделились своей концепцией. Его разработка для моего проекта. Невозможно проголосовать за свой ответ из-за моей низкой репутации. –

1

Возможно, вы захотите разместить страницу в /users/:user_id/phone_books/:id.

Для достижения этой цели,

Вы должны настроить пути в config/routes.rb:

resources :users do 
    resources :phone_books 
end 

И в app/controllers/phone_books_controller.rb, найти пользователя и их адресную книгу:

class PhoneBooksController < ApplicationController 
    before_action :find_user 

    def show 
    @address_book = @user.address_books.find(params[:id]) 
    end 

    private 

    def find_user 
    @user = User.find(params[:user_id]) 
    end 
end 

Для получения более подробной информации о вложенных ресурсах, см. руководство Getting Started with Rails.

+0

Нет маршрута, который соответствует «/ users/10/contacts/2» с {: method =>: get}. У меня есть контакты с id = 2 и пользователи с id = 10, хранящиеся в базе данных. контакты аналогичны phone_books –

+0

@pranavprashant На какой странице происходит ошибка? Вы пытались перезапустить сервер Rails? Можете ли вы попробовать запустить команду «rake routes» и обновить результат в вопросе? – Domon