我有一个已登录的用户个人资料,每个个人资料都有自己的电话簿,其他用户无法访问。问题是我应该如何实现它。将用户视为一个控制器而将电话簿视为另一个控制器,我无法在特定用户登录时建立两者之间的关系。
我的方法应该是什么?
我有一个用户的sparate模型和电话簿的单独模型,并使用 has_many 和 belongs_to 宏建立了它们之间的关系。
答案 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指南。
答案 1 :(得分:1)
让我们从模型开始。你说每个User
只有只有一个 PhoneBook
所以我会说正确的模型应该是:
class User < ActiveRecord::Base
has_one :phone_book
end
class PhoneBook < ActiveRecord::Base
belongs_to :user
end
现在,关于控制器。
当您登录User
时,您最终会有一个&#34;会话事项&#34;继续
我们假设您正在使用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
最后,如果您希望这些电话簿可公开阅读,我建议您坚持使用REST种URI
/phone_books/:id <-- good
/users/:id/phone_books/:phone_book_id <-- too complex
希望我能帮忙